首页/系统/Linux 运维命令速查/tr 字符替换与删除
文本处理77 条

tr 字符替换与删除

字符级转换器:大小写互转、删空白、压缩重复字符、清理 CRLF;只能处理单个字符,不能替换字符串。

Linux 运维命令速查系统更新于 2026-10-13

tr 是什么

tr 在字符级别做转换:把集合 1 中出现的字符替换成集合 2 中对应位置的字符,或用 -d 删除集合 1 里的字符,用 -s 把连续重复字符压缩成一个。日常高频的用法有三个:tr -d '\r' 清掉 Windows 换行里的回车、tr 'a-z' 'A-Z' 转大写、tr -s ' ' 把多个连续空格归一化。它的边界也很清晰:只认字符集不认字符串,按位置对应而不是按语义匹配,并且不接受文件名参数,只能从标准输入或管道读数据。

基本信息

适用平台Linux/macOS(GNU coreutils 与 BSD tr)
命令语法tr [选项] 集合1 [集合2]
常用选项-d 删除集合 1 中的字符 -s 压缩连续重复字符 -c 取集合 1 的补集 -t 先把集合 2 截断到等长
字符集合写法a-z 范围;[:alnum:] [:alpha:] [:digit:] [:space:] [:punct:] 等 POSIX 字符类
输入方式标准输入或管道,不接受文件名参数

典型使用场景

  • 换行符统一:把 Windows 打包的文本清掉 \r,避免脚本里变量带不可见字符
  • 大小写归一:写配置或比对时统一转大写或小写
  • 空白压缩:整理列对齐输出后作为 cut 或 awk 的输入
  • 删除不可见字符:清除 NUL 或其它控制字符
  • 词频统计:把非字母数字字符统一替换成换行再排序计数

常用示例

常用示例
tr 'a-z' 'A-Z' < file              # 小写转大写
tr -d '\r' < win.txt > unix.txt    # 清掉 CRLF 里的 \r
tr -s ' ' < messy.txt              # 连续空格压成一个
tr -d '\000' < file > clean.txt    # 删除 NUL 字节
tr -cs '[:alnum:]' '\n' < doc.txt | sort | uniq -c | sort -rn | head   # 词频
tr ':' '\t' < /etc/passwd          # 冒号换成制表符

选项作用对照

选项作用典型用法
无选项按位置把集合 1 映射到集合 2大小写转换、分隔符替换
-d删除集合 1 中出现的字符清 \r、清 NUL 与控制字符
-s把连续重复字符压缩为一个多空格或空行归一化
-c取集合 1 的补集与 -d 或 -s 组合,只保留指定字符
-t先把集合 2 截断到与集合 1 等长避免集合长度不一致带来的意外映射
tr 是字符级工具,不能替换字符串。要把 old 换成 new,用 sed 或 awk;tr 'old' 'new' 只会按位置把 o、l、d 三个字符分别映射。
处理 \r 时要写成 '\r' 形式并加引号,直接写 可能被 shell 解释成字母 r,清不掉真正想删的回车符。

易错点

  • tr 不接受文件名参数:写 tr file 会进入等待键盘输入的状态,必须用重定向或管道
  • 集合按位置对应,第二个集合短于第一个时会重复末尾字符填充,结果可能出乎意料
  • tr 按字节操作,用它处理中文等多字节字符集无效
  • -d 与 -s 混用或参数个数写错会直接报错,删除字符时不要遗漏 -d

数据来源与参考

  • man 1 tr(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌