tr
(translate)是 Linux/Unix 中用于字符替换、删除或压缩的文本处理工具,它直接处理标准输入(stdin),输出到标准输出(stdout),是 Shell 脚本中高频使用的命令之一。
核心语法格式
tr [选项] SET1 [SET2]
- SET1:要操作的原字符集
- SET2:替换后的目标字符集(若未指定,则默认删除操作)
- 重要特性:
tr
按字符(非单词)逐字处理文本。
常用选项速查
选项 | 作用 |
---|---|
-d |
删除 SET1 中的字符 |
-s |
压缩连续重复字符(去重) |
-c |
对 SET1 的补集操作(即“非 SET1 的字符”) |
-t |
将 SET1 截断为与 SET2 等长(避免多字符替换) |
高频使用场景详解
字符替换(基础)
# 输出:HELLO WORLD # 替换特定字符(如空格变下划线) echo "file name.txt" | tr ' ' '_' # 输出:file_name.txt # 加密:ROT13 算法(字母偏移13位) echo "secret" | tr 'a-zA-Z' 'n-za-mN-ZA-M' # 输出:frperg
删除字符(-d
)
# 删除所有数字 echo "phone: 123-456" | tr -d '0-9' # 输出:phone: - # 删除换行符(合并多行为单行) tr -d '\n' < input.txt # 删除非数字字符(结合 `-c`) echo "a1b2c3" | tr -cd '0-9' # 输出:123
压缩重复字符(-s
)
# 压缩连续空格为单空格 echo "too many spaces" | tr -s ' ' # 输出:too many spaces # 压缩重复字母(如多个换行变一个) echo -e "a\n\n\nb" | tr -s '\n' # 输出: # a # b
字符集等价类(预定义字符组)
tr
支持 POSIX 字符类,简化常见匹配:
# 删除所有标点符号 echo "Hello! How are you?" | tr -d '[:punct:]' # 输出:Hello How are you # 常用等价类: # [:alnum:] 字母+数字 [:digit:] 数字 [:lower:] 小写字母 # [:upper:] 大写字母 [:space:] 空白符 [:alpha:] 字母
进阶技巧
- 保留换行符:用
\n
显式指定echo -e "a\nb\nc" | tr 'a-c' 'x-z' # 替换字母但保留换行
- 十六进制转义:用
\xNN
表示特殊字符echo "data" | tr 'a' '\x01' # 将 'a' 替换为 ASCII 0x01
避坑指南
-
不支持正则表达式
tr
仅处理单个字符,不支持 、 等正则元字符。
错误示例:tr 'abc' 'def'
不会替换字符串 “abc”,而是分别替换 a→d、b→e、c→f。 -
字符集长度需匹配
若SET1
比SET2
长,SET2
会重复最后一个字符补齐:echo "abc" | tr 'abcd' 'XYZ' # a→X, b→Y, c→Z, d→Z
-
处理二进制文件需谨慎
tr
可能破坏二进制数据(如图片、可执行文件),建议仅用于文本。
典型应用场景
- 日志清洗:删除无关字符或压缩空格
- 数据格式化:CSV 文件分隔符转换(如逗号转制表符)
- 密码生成:结合
/dev/urandom
生成随机字符串cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 12
tr
是 Linux 文本处理的“瑞士军刀”,以简洁高效著称,虽然功能单一(仅限字符级操作),但在管道命令组合中不可或缺,掌握其核心用法(替换、删除、压缩)和字符集规则,可大幅提升命令行文本处理效率。
引用说明参考 Linux man-pages (tr 1.0) 及 GNU Coreutils 文档,结合常见运维实践整理。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/8192.html