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,清不掉真正想删的回车符。