概述
tr 命令,这个命令是字符转换/替换/删除工具 ,核心作用是对文本中的单个字符进行批量处理------包括字符替换、大小写转换、删除指定字符、压缩重复字符等,特点是轻量、高效、仅处理单个字符,是文本字符级处理的基础工具。
资料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
一、核心特点
- 仅处理单个字符 :无法处理多字符字符串(如把
abc替换成123需逐个字符对应); - 按字符集映射:替换时按「源字符集」和「目标字符集」的位置一一对应;
- 支持标准输入:无文件参数时读取管道/标准输入,是管道组合的高频工具;
- 无修改原文件 :仅输出处理结果,需通过重定向
>写入文件才会修改内容。
二、基本语法
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的核心区别
tr和sed均为文本处理工具,但处理粒度和场景完全不同,避免用错工具:
| 命令 | 处理粒度 | 核心能力 | 适用场景 |
|---|---|---|---|
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(灵活强大)。
十、关键注意事项
- 仅单字符处理 :tr无法处理多字符替换(如
tr "abc" "123"是a→1、b→2、c→3,而非abc整体替换为123); - 字符集长度 :替换时若源字符集长度 > 目标字符集,目标最后一个字符会重复映射(如
tr abc 12→ a→1、b→2、c→2); - 原文件不修改 :tr仅输出处理结果,需用
>重定向写入文件才会保存修改; - 转义符使用 :特殊字符(如
\t、\n)需用双引号/单引号包裹,避免终端解析错误; - 中文处理 :tr按字节处理UTF-8中文(占3字节),直接替换/删除中文可能乱码,需确保字符集匹配(推荐用
sed处理中文)。
十一、总结
tr 是Linux字符级处理的轻量神器 ,核心价值是用极简语法实现单个字符的批量替换、删除、压缩,无需复杂脚本,是管道组合的高频工具,其核心要点可总结为:
- 核心功能:替换(一一映射)、删除(-d)、压缩(-s)、取反(-c);
- 高频场景:大小写转换、空格/换行压缩、字符过滤、换行符转换;
- 工具边界:单字符处理用tr,多字符/行级处理用sed;
- 组合用法:与grep、cut、wc等搭配,实现文本清洗、日志处理、数据提取。