Linux 命令:tr

概述

tr 命令,这个命令是字符转换/替换/删除工具 ,核心作用是对文本中的单个字符进行批量处理------包括字符替换、大小写转换、删除指定字符、压缩重复字符等,特点是轻量、高效、仅处理单个字符,是文本字符级处理的基础工具。

资料合集:https://pan.quark.cn/s/6fe3007c3e95https://pan.quark.cn/s/561de99256a5https://pan.quark.cn/s/985f55b13d94https://pan.quark.cn/s/d0fb20abd19a

一、核心特点

  1. 仅处理单个字符 :无法处理多字符字符串(如把abc替换成123需逐个字符对应);
  2. 按字符集映射:替换时按「源字符集」和「目标字符集」的位置一一对应;
  3. 支持标准输入:无文件参数时读取管道/标准输入,是管道组合的高频工具;
  4. 无修改原文件 :仅输出处理结果,需通过重定向>写入文件才会修改内容。

二、基本语法

bash 复制代码
tr [选项] 源字符集 目标字符集  # 替换/转换(核心)
tr [选项] 字符集               # 删除/压缩(仅一个字符集)
  • 字符集写法 :支持直接写字符(如abc)、范围(如a-z)、特殊转义符(如\t制表符、\n换行符);
  • 常用特殊字符集简写(GNU tr支持):
    • [:upper:]:所有大写字母(A-Z)
    • [:lower:]:所有小写字母(a-z)
    • [:digit:]:所有数字(0-9)
    • [:space:]:所有空白字符(空格、制表符、换行符等)
    • [:punct:]:所有标点符号

三、核心选项

tr 的选项围绕「替换、删除、压缩」设计,无冗余选项,核心功能一键实现:

选项 作用 实用场景
-d 删除源字符集中的所有字符 过滤文本中的指定字符(如数字、标点、空格)
-s 压缩源字符集中的连续重复字符为单个 压缩连续空格/换行符、去重连续重复字符
-c 取反:匹配「非源字符集」的所有字符 保留指定字符,删除其他所有字符(反向过滤)
-t 截断目标字符集:仅替换到源字符集长度(默认目标超长时重复最后一个字符) 精准字符映射,避免默认的重复填充
-s + 字符集 仅压缩指定字符的连续重复(单独使用) 压缩连续空行、连续空格为单个

四、经典实操示例

准备测试文本
bash 复制代码
# 生成测试文本(含大小写、数字、空格、标点)
echo "Hello World! 123  456\nLinux 命令 Tr, 测试  文本" > tr_test.txt

五、核心功能1:字符替换/转换

场景1:大小写转换
bash 复制代码
# 1. 小写转大写(两种写法,推荐简写更易读)
cat tr_test.txt | tr a-z A-Z
cat tr_test.txt | tr [:lower:] [:upper:]
# 输出:HELLO WORLD! 123  456\nLINUX 命令 TR, 测试  文本

# 2. 大写转小写
cat tr_test.txt | tr A-Z a-z
cat tr_test.txt | tr [:upper:] [:lower:]
# 输出:hello world! 123  456\nlinux 命令 tr, 测试  文本
场景2:字符一一映射替换
bash 复制代码
# 把数字0-9替换为a-j(按位置一一对应)
echo "12345" | tr 0123456789 abcdefghij
# 输出:bcdef

# 把空格替换为制表符
cat tr_test.txt | tr " " "\t"
# 输出:Hello\tWorld!\t123\t\t456\nLinux\t命令\tTr,\t测试\t\t文本
场景3:精准替换
bash 复制代码
# 无-t:目标超长时,源字符集最后一个字符映射到目标剩余所有字符
echo "abc" | tr abc 12345  # a→1, b→2, c→3,目标45无对应但不影响
# 输出:123

# 加-t:仅替换到源字符集长度,截断目标字符集(精准映射)
echo "abc" | tr -t abc 12345  # 效果同上,更规范

六、核心功能2:删除指定字符

场景1:删除数字/标点/空格
bash 复制代码
# 1. 删除所有数字
cat tr_test.txt | tr -d 0-9
cat tr_test.txt | tr -d [:digit:]
# 输出:Hello World!   \nLinux 命令 Tr, 测试  文本

# 2. 删除所有标点符号
cat tr_test.txt | tr -d [:punct:]
# 输出:Hello World 123  456\nLinux 命令 Tr 测试  文本

# 3. 删除所有空格(含制表符,用[:space:]仅删空白,保留换行)
cat tr_test.txt | tr -d " "
# 输出:HelloWorld!123456\nLinux命令Tr,测试文本
场景2:保留指定字符,删除其他所有
bash 复制代码
# 仅保留字母和换行符,删除其他所有字符(数字、空格、标点、中文)
cat tr_test.txt | tr -cd a-zA-Z"\n"
# 输出:HelloWorld\nLinuxTr

七、核心功能3:压缩连续重复字符

场景1:压缩连续空格/换行符
bash 复制代码
# 1. 压缩连续空格为单个(解决文本中多余空格问题)
cat tr_test.txt | tr -s " "
# 输出:Hello World! 123 456\nLinux 命令 Tr, 测试 文本

# 2. 压缩连续空行为单个(日志去重空行)
echo -e "line1\n\n\nline2\n\nline3" | tr -s "\n"
# 输出:
# line1
# line2
# line3

# 3. 压缩指定重复字符(如连续的数字8)
echo "888999777" | tr -s 89
# 输出:8999777(仅8被压缩为单个,9仍保留连续)
场景2:替换+压缩组合
bash 复制代码
# 把所有换行符替换为空格,再压缩连续空格为单个(日志行合并)
cat tr_test.txt | tr "\n" " " | tr -s " "
# 输出:Hello World! 123 456 Linux 命令 Tr, 测试 文本

八、高频组合用法

1. 日志处理:合并多行日志为单行,删除多余空格
bash 复制代码
cat app.log | tr "\n" " " | tr -s " " > app_single.log
2. 文本清洗:仅保留字母、数字和中文,删除其他字符
bash 复制代码
# 中文需用范围(不同编码可能不同,UTF-8下[\4e00-\9fa5]为中文)
cat text.txt | tr -cd a-zA-Z0-9"\4e00-\9fa5"\n
3. 生成随机密码:取/dev/urandom的字符,过滤后取10位
bash 复制代码
cat /dev/urandom | tr -cd a-zA-Z0-9 | head -c 10
# 输出:8k9s7B2x5G(随机10位字母数字密码)
4. 转换Windows换行符(\r\n)为Linux换行符(\n)
bash 复制代码
# 删除\r(回车符),仅保留\n,解决Windows文件在Linux的换行问题
dos2unix 等价于:tr -d "\r" < windows.txt > linux.txt
5. 统计文本中数字出现的总次数
bash 复制代码
cat tr_test.txt | tr -cd [:digit:] | wc -c
# 输出:6(tr_test.txt中有123456共6个数字)

九、与sed的核心区别

trsed均为文本处理工具,但处理粒度和场景完全不同,避免用错工具:

命令 处理粒度 核心能力 适用场景
tr 单个字符 字符替换、删除、压缩(仅单字符) 大小写转换、字符过滤、重复字符压缩、简单字符映射
sed 行/字符串 字符串替换、行增删、正则匹配 多字符替换(如abc→123)、行级过滤、正则替换
经典对比示例
bash 复制代码
# 需求1:把所有a替换为1,b替换为2(单字符,tr更简单)
echo "abcab" | tr ab 12  # 输出:12c12

# 需求2:把字符串abc替换为123(多字符,tr无法实现,用sed)
echo "abcab" | sed 's/abc/123/g'  # 输出:123ab(tr做不到)

# 需求3:删除所有空格(tr更高效)
echo "a b  c" | tr -d " "  # 输出:abc

# 需求4:删除包含"test"的行(行级处理,用sed)
echo -e "test1\ntest2\nline3" | sed '/test/d'  # 输出:line3

结论单字符处理用tr (高效简洁);多字符/行级/正则处理用sed(灵活强大)。

十、关键注意事项

  1. 仅单字符处理 :tr无法处理多字符替换(如tr "abc" "123"是a→1、b→2、c→3,而非abc整体替换为123);
  2. 字符集长度 :替换时若源字符集长度 > 目标字符集,目标最后一个字符会重复映射(如tr abc 12 → a→1、b→2、c→2);
  3. 原文件不修改 :tr仅输出处理结果,需用>重定向写入文件才会保存修改;
  4. 转义符使用 :特殊字符(如\t\n)需用双引号/单引号包裹,避免终端解析错误;
  5. 中文处理 :tr按字节处理UTF-8中文(占3字节),直接替换/删除中文可能乱码,需确保字符集匹配(推荐用sed处理中文)。

十一、总结

trLinux字符级处理的轻量神器 ,核心价值是用极简语法实现单个字符的批量替换、删除、压缩,无需复杂脚本,是管道组合的高频工具,其核心要点可总结为:

  1. 核心功能:替换(一一映射)、删除(-d)、压缩(-s)、取反(-c);
  2. 高频场景:大小写转换、空格/换行压缩、字符过滤、换行符转换;
  3. 工具边界:单字符处理用tr,多字符/行级处理用sed;
  4. 组合用法:与grep、cut、wc等搭配,实现文本清洗、日志处理、数据提取。
相关推荐
mengge.cloud3 分钟前
云计算&服务器基础小白教程
android·linux·运维·服务器·网络·云计算
一路向北finish5 分钟前
《Hadoop 高可用集群与 OpenStack Mitaka 控制节点部署全流程实操排坑指南》
大数据·linux·运维·服务器·hadoop·openstack
南棱笑笑生11 分钟前
20260826解决在Ubuntu22.04系统下编译RK3572的Buildroot【linux-6.12.69】出现CMake异常的问题
linux·运维·服务器
hh95015 分钟前
Agent Plan x DeepSeek Harness:分布式Agent集群调度与负载均衡
运维·分布式·负载均衡·adg·agent plan·adg成都社区
FIT2CLOUD飞致云16 分钟前
3分钟通过1Panel搭建安全隔离的DeepSeek Harness
运维·开源·1panel·运维面板
荣合技术服务16 分钟前
安装Windows Server 2008系统时 USB 鼠标键盘无法操作的解决方案
服务器·计算机外设·windows2008
lskblog29 分钟前
Ubuntu 18.04 安装 LibreOffice(用于 Word 在线预览转换)
java·linux·python·ubuntu·word·php·laravel
王志来1379447300834 分钟前
多元场景催生工控服务器机箱差异化需求匀天以柔性适配回应行业挑战
运维·服务器·人工智能·python
敲上瘾1 小时前
Redis持久化存储机制:从RDB到AOF再到混合持久化的配置与实践
linux·数据库·redis·缓存