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等搭配,实现文本清洗、日志处理、数据提取。
相关推荐
Trouvaille ~6 小时前
【Linux】应用层协议设计实战(一):自定义协议与网络计算器
linux·运维·服务器·网络·c++·http·应用层协议
allway26 小时前
基于华为taishan200服务器、arm架构kunpeng920 cpu的虚拟化实战
linux·运维·服务器
Junlan276 小时前
Cursor使用入门及连接服务器方法(更新中)
服务器·人工智能·笔记
CSCN新手听安6 小时前
【linux】高级IO,I/O多路转接之poll,接口和原理讲解,poll版本的TCP服务器
linux·运维·服务器·c++·计算机网络·高级io·poll
熊文豪6 小时前
服务器炸了才知道?Ward+cpolar让异常无处藏
运维·服务器·cpolar
杜子不疼.6 小时前
【Linux】教你在 Linux 上搭建 Web 服务器,步骤清晰无门槛
linux·服务器·前端
荔枝吻7 小时前
忘记服务器密码,在Xshell7中查看已保存密码
运维·服务器·github
码农阿豪7 小时前
多服务器批量指令管理:从Xshell到自动化运维
运维·服务器·自动化
Pocker_Spades_A7 小时前
在家也能连公司服务器写代码?GoLand+CPolar 远程开发实测
运维·服务器