Linux下的tr命令是一个用于转换或删除字符的实用工具,其名称来源于“transliterate”(音译/转写),它主要用于从标准输入中读取数据,经过字符转换或删除处理后,将结果输出到标准输出,常用于文本处理流程中配合其他命令使用(如通过管道符“|”连接),tr命令的功能相对简单,但结合正则表达式和字符集操作,可以实现复杂的文本处理需求。

tr命令的基本语法为tr [选项]... SET1 [SET2]
,其中SET1和SET2是字符集,可以是具体字符、字符范围或预设字符类,常用选项包括:-d
用于删除SET1中出现的所有字符;-s
用于将连续重复的字符缩减为单个字符;-c
或-C
表示取反,即处理SET1中未出现的字符;-t
或--truncate-set1
截断SET1使其长度与SET2相同(默认情况下,若SET2长度短于SET1,则用SET2最后一个字符填充),需要注意的是,tr命令仅处理单字节字符,对多字节字符(如UTF-8中的中文)支持有限,需结合其他工具处理多字节场景。
字符集的表示方式灵活多样,具体字符可直接列出,如tr 'abc' '123'
将a替换为1、b替换为2、c替换为3;字符范围用连接,如tr 'a-z' 'A-Z'
将小写字母转为大写;预设字符类需用[]
括起来,如tr '[[:lower:]]' '[[:upper:]]'
同样实现小写转大写([:lower:]
表示所有小写字母,[:upper:]
、[:digit:]
、[:alnum:]
等类似),取反操作可通过[^字符集]
或[[:alpha:]]
配合-c
实现,例如tr -d '[^0-9]'
删除所有非数字字符。
实际应用场景中,tr命令常用于数据清洗和格式转换,处理日志文件时,可用cat log.txt | tr -d '\r'
删除Windows风格的回车符(\r
);将制表符转为空格可通过tr '\t' ' '
实现;压缩连续空格为单个空格可用tr -s ' '
;生成随机密码时,可结合tr
和/dev/urandom
:cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c12
生成12位字母数字密码,tr命令还可用于字符替换的简单场景,如tr ' ' '.'
将空格替换为点号,但需注意替换是一对一进行的,若SET1和SET2长度不等,超出部分会按规则处理(SET2较短时重复最后一个字符,较长时忽略多余字符)。
以下是tr命令常用字符类的示例说明:

字符类 | 说明 | 示例(配合tr命令) |
---|---|---|
[:upper:] | 大写字母 | tr '[:lower:]' '[:upper:]' |
[:lower:] | 小写字母 | tr '[:upper:]' '[:lower:]' |
[:digit:] | 数字(0-9) | tr -d '[:digit:]' 删除所有数字 |
[:alnum:] | 字母数字 | tr -c '[:alnum:]' '\n' 替换非字母数字为换行 |
[:punct:] | 标点符号 | tr -d '[:punct:]' 删除所有标点 |
[:space:] | 空白字符(含空格、制表符等) | tr -s '[:space:]' 压缩空白字符 |
需要注意的是,tr命令的局限性在于它不直接支持正则表达式中的元字符(如、等),且无法处理多字节字符的替换或删除,对于复杂文本处理,建议结合sed
、awk
或perl
等工具,tr命令的行为可能受当前locale设置影响,例如在非UTF-8 locale下处理多字节字符可能出现异常,使用前可通过locale
命令检查环境设置。
相关问答FAQs:
-
问题:tr命令如何删除文件中的所有空行?
解答: 可结合tr
和grep
实现,cat file.txt | tr -d '\n' | grep -E '.'
会先删除所有换行符,再保留非空行;但更简单的方式是使用grep
:grep -v '^$' file.txt
,其中-v
表示取反,'^$'
匹配空行,若需用tr,可尝试:cat file.txt | sed '/^$/d'
(通过sed删除空行),或cat file.txt | tr '\n' '\0' | tr -s '\0' '\n'
(间接处理,但效率较低)。 -
问题:tr命令能否替换字符串中的连续多个字符?
解答: tr命令本身不直接支持替换连续字符串,但可通过-s
选项压缩连续字符后配合其他工具实现,将连续的多个逗号替换为单个逗号:echo "a,,b,,,c" | tr -s ','
,输出为a,b,c
,若需替换为其他字符(如连续逗号替换为分号),可先用tr -s ','
压缩,再通过tr ',' ';'
替换:echo "a,,b,,,c" | tr -s ',' | tr ',' ';'
,输出为a;b;c
,对于更复杂的连续字符串替换(如替换“abc”为“xyz”),需使用sed
(如sed 's/abc/xyz/g'
)。(图片来源网络,侵删)