tr(translate)是Linux/Unix中用于字符级转换、删除和压缩的流处理工具。它设计简洁高效,特别适合在管道中与其他命令配合使用。
下面是它的核心功能与语法概览:
| 项目 | 说明 |
|---|---|
| 核心功能 | 字符转换、删除指定字符、压缩(缩减)连续重复字符。 |
| 关键特性 | 仅处理字符 ,不支持字符串;从标准输入读取数据,输出到标准输出。 |
| 基本语法 | tr [选项] 字符集1 [字符集2] |
| 常用选项 | -c / -C:使用字符集1的补集 -d:删除 属于字符集1的字符 -s:将字符集1中列出的连续重复字符压缩为单个 -t:将字符集1的长度截断为与字符集2相等 |
📖 理解字符集表示
tr 的强大之处在于灵活的字符集定义:
-
范围表示 :
[a-z](小写字母),[A-Z],[0-9]。 -
组合与枚举 :
[a-z0-9](小写字母和数字),[abcxyz](特定字符)。 -
预定义字符类(更可读、可移植):
表示 含义 [:alnum:]字母和数字 [:alpha:]字母 [:digit:]数字 [:lower:]小写字母 [:upper:]大写字母 [:space:]所有空白字符(空格、制表符、换行等) -
特殊字符转义 :用
\n(换行)、\t(水平制表符)、\r(回车)等表示控制字符。
🔧 核心功能详解与技巧
1. 字符替换
这是最基本的功能,将字符集1中的字符一对一替换为字符集2中的对应字符。
-
基本替换 :
echo "hello" | tr 'el' 'ip'输出hippo(e->i, l->p)。 -
大小写转换:
bash
echo "Hello World" | tr 'a-z' 'A-Z' # 输出 HELLO WORLD
echo "Hello World" | tr '[:lower:]' '[:upper:]' # 同上,使用字符类[citation:3][citation:7]
使用补集替换 (-c) :替换所有不属于字符集1的字符 。常与 -d 或 -s 联用。
bash
# 只保留数字和换行,其他所有字符被删除
echo "Phone: 123-4567" | tr -cd '[:digit:]\n'
# 输出 1234567
2. 字符删除
使用 -d 选项直接删除所有出现在字符集1中的字符。
bash
# 删除所有数字
echo "my phone is 12345" | tr -d '[:digit:]'
# 输出 my phone is
# 删除特定字符(如删除windows文件换行符^M)
cat windows_file.txt | tr -d '\r' > unix_file.txt[citation:6]
3. 字符缩减(压缩)
使用 -s 选项,将连续重复出现的字符压缩为单个。
bash
# 压缩多余的空格
echo "too many spaces" | tr -s ' '
# 输出 too many spaces[citation:10]
# 压缩空行(本质是压缩连续的换行符)
cat file_with_blanks.txt | tr -s '\n'
# 先转换再压缩:将非字母字符替换为换行,然后压缩换行符,实现"分词"
echo "hello,world;foo|bar" | tr -cs '[:alpha:]' '\n'
# 输出
# hello
# world
# foo
# bar
💡 经典应用场景
文本清理与格式化
bash
# 将文件中的制表符替换为空格
cat file.txt | tr '\t' ' '
# 将连续的分隔符(如逗号、空格)统一为一个逗号
echo "a,b,,c d" | tr -s ', ' ',' # 输出 a,b,c,d(注意处理逻辑)
简单编码与加密
bash
# 实现简单的字母移位(凯撒密码)
echo "hello" | tr 'a-z' 'defghijklmnopqrstuvwxyzabc'
# 输出 khoor
处理Windows文本文件 :Windows换行符是\r\n,Unix是\n,转换方法
bash
tr -d '\r' < windows.txt > unix.txt # 删除回车符
# 或
tr '\r' '\n' < windows.txt > unix.txt # 将回车符转换为换行符
生成序列或随机字符串
bash
# 生成随机小写字母串
cat /dev/urandom | tr -dc 'a-z' | head -c 10
⚠️ 重要注意事项
-
字符串与字符 :
tr只能处理字符 ,不能将"hello"作为一个整体字符串替换为"hi"。这类操作需使用sed或awk。 -
集合对应关系 :替换时,如果字符集2比字符集1短 ,字符集2的最后一个字符会被重复使用以匹配长度(除非用
-t截断)。最好保持两者等长。 -
原地修改文件 :
tr默认不直接修改文件。如需"原地修改",通常需要借助临时文件或sponge命令(需安装):
bash
cat file.txt | tr 'a-z' 'A-Z' | sponge file.txt
tr 在简单、快速的字符流处理上无可替代。对于更复杂的模式匹配、字符串替换或行列操作,可以考虑 sed、awk 或 perl 等工具。