tr命令用法详解与技巧总结

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"。这类操作需使用 sedawk

  • 集合对应关系 :替换时,如果字符集2比字符集1 ,字符集2的最后一个字符会被重复使用以匹配长度(除非用-t截断)。最好保持两者等长。

  • 原地修改文件tr 默认不直接修改文件。如需"原地修改",通常需要借助临时文件或 sponge 命令(需安装):

bash 复制代码
cat file.txt | tr 'a-z' 'A-Z' | sponge file.txt

tr 在简单、快速的字符流处理上无可替代。对于更复杂的模式匹配、字符串替换或行列操作,可以考虑 sedawkperl 等工具。

相关推荐
XIAOHEZIcode1 小时前
Ubuntu 终端美化全栈指南:Bash 到 Kitty 踩坑实录
linux·ubuntu·命令行
唐青枫3 小时前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux
用户805533698034 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297914 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
Web3探索者6 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo6 天前
Linux系统中网线与USB网络共享冲突
linux
Sokach10157 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux