tr
(translate)是 Linux/Unix 系统中用于字符替换、删除或压缩的文本处理工具,它直接处理标准输入(stdin)并输出到标准输出(stdout),是 Shell 脚本中高频使用的命令之一,以下是详细用法指南:
基础语法
tr [选项] SET1 [SET2]
- SET1:被替换或删除的字符集合
- SET2:替换后的字符集合(若未提供,则默认删除 SET1 中的字符)
- 常用选项:
-d
:删除 SET1 中的字符-s
:压缩连续重复字符(将多个重复字符缩为单个)-c
:对 SET1 的补集操作(即匹配 SET1 以外的字符)
核心功能与示例
字符替换
# 输出:HELLO WORLD # 替换特定字符(冒号→空格) echo "2025:12:31" | tr ':' ' ' # 输出:2025 12 31
删除字符 (-d
)
# 删除所有数字 echo "phone: 123-456" | tr -d '0-9' # 输出:phone: - # 删除换行符(合并多行为单行) tr -d '\n' < file.txt
压缩重复字符 (-s
)
# 压缩连续空格为单空格 echo "too many spaces" | tr -s ' ' # 输出:too many spaces # 压缩重复字母(如多个 'a'→单个 'a') echo "baaaanaaa" | tr -s 'a' # 输出:banana
补集操作 (-c
)
# 删除所有非数字字符 echo "ID: A1B2C3!" | tr -cd '0-9' # 输出:123
字符类缩写
tr
支持预定义字符类,简化操作:
[:alnum:]
:字母和数字[:alpha:]
:字母[:digit:]
:数字[:lower:]
:小写字母[:upper:]
:大写字母# 将所有非字母字符替换为空格 echo "email@example.com" | tr -c '[:alpha:]' ' '
进阶技巧
字符集对应替换
若 SET1
和 SET2
长度不同:
SET1
较长时,SET2
的最后一个字符会被重复使用SET2
较长时,多余字符被忽略# 将 a→1, b→2, c→2(c 对应 SET2 最后一个字符 '2') echo "abc" | tr 'abc' '12' # 输出:122
转义特殊字符
处理换行符 \n
、制表符 \t
等需用转义:
# 替换制表符为空格 cat data.tsv | tr '\t' ' '
文件直接处理
通过重定向操作文件:
# 替换文件内容并保存为新文件 tr 'a-z' 'A-Z' < input.txt > output.txt
注意事项
- 不支持正则表达式
tr
仅处理单个字符,不支持 、 等正则符号,需复杂匹配时,建议用sed
或awk
。 - 字符集顺序敏感
'a-z'
和'A-Z'
需根据语言环境调整,非 ASCII 字符(如中文)可能异常。 - 输入输出限制
只能通过管道或重定向处理数据,不能直接修改原文件(需配合重定向保存结果)。
典型应用场景
- 数据清洗:删除日志中的非打印字符
tr -cd '[:print:]\n' < dirty.log > clean.log
- 格式转换:CSV 文件分隔符替换(逗号→竖线)
tr ',' '|' < data.csv
- 密码生成:创建随机字符串
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 12
tr
以简洁高效著称,尤其适合单字符级的文本处理,虽然功能不如 sed
/awk
全面,但在删除、替换、压缩等场景中性能更优,掌握其核心用法可大幅提升命令行操作效率。
引用说明参考 Linux 手册页(
man tr
)及 GNU Coreutils 官方文档,结合常见运维实践整理而成。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/7593.html