Linux中的tr命令是一个功能强大的文本处理工具,主要用于字符转换、删除和压缩操作,它属于GNU coreutils包,是Linux/Unix系统中处理文本流的基础命令之一,tr命令从标准输入中读取文本,经过处理后输出到标准输出,常与其他命令通过管道组合使用,实现复杂的文本处理任务。

tr命令的基本语法结构为tr [选项] 字符集1 [字符集2]
,其中字符集1和字符集2可以包含单个字符、字符范围或预定义字符类,字符范围使用连字符表示,如a-z
表示所有小写字母,0-9
表示数字0到9,预定义字符类包括alnum
(字母数字)、alpha
(字母)、digit
(数字)、lower
(小写字母)、upper
(大写字母)、punct
(标点符号)等,使用时需加[: :]
括号,如[:lower:]
。
tr命令的核心功能之一是字符转换,当提供两个字符集时,tr会将字符集1中的每个字符转换为字符集2中对应位置的字符。tr 'a-z' 'A-Z'
将所有小写字母转换为大写字母,如果字符集1的长度大于字符集2,多余的字符会被映射到字符集2的最后一个字符;如果字符集1的长度小于字符集2,则忽略字符集2多余的字符。tr 'abc' '123'
会将a转为1,b转为2,c转为3;tr 'abcde' '123'
会将d和e都转为3。
删除功能是tr命令的另一个重要特性,使用-d
选项可以删除字符集1中指定的所有字符。tr -d '0-9'
会删除所有数字字符;tr -d '\r'
可以删除文件中的回车符(适用于处理Windows和Unix文本格式差异),删除操作只接受一个字符集参数,忽略第二个字符集参数。
压缩功能通过-s
选项实现,用于将连续重复的字符压缩为单个字符。tr -s ' '
会将多个连续空格压缩为一个空格;tr -s '\n'
会将连续的换行符压缩为一个换行符,此功能常用于处理格式混乱的文本,如日志文件或表格数据。

tr命令还支持字符集的补集操作,使用-c
或-C
选项可以指定字符集1的补集(即不在字符集1中的所有字符)。tr -c 'a-z' ' '
会将所有非小写字母的字符替换为空格;tr -d -c '[:print:]'
会删除所有不可打印字符,补集操作与-d
选项结合使用时特别有用,可以快速过滤特定类型的字符。
在实际应用中,tr命令常与其他命令配合使用。cat file.txt | tr 'a-z' 'A-Z'
转为大写;ls -l | tr -s ' '
压缩ls输出中的多余空格;echo "hello 123" | tr -d '0-9'
删除数字后输出"hello ",tr命令还支持使用八进制或十六进制转义序列表示特殊字符,如\012
表示换行符,\011
表示制表符。
以下是tr命令常用选项的详细说明:
选项 | 功能描述 | 示例 |
---|---|---|
-d |
删除所有属于字符集1的字符 | tr -d '\r' 删除回车符 |
-s |
将连续重复的字符压缩为单个字符 | tr -s ' ' 压缩空格 |
-c |
使用字符集1的补集 | tr -c 'a-z' ' ' 替换非小写字母 |
-C |
同-c ,POSIX标准推荐 |
tr -C '[:digit:]' ' ' 替换非数字 |
-t |
截断字符集1和字符集2为相同长度 | tr -t 'abcde' '123' 将d,e转为3 |
--help |
显示帮助信息 | tr --help |
--version |
显示版本信息 | tr --version |
tr命令的字符集定义非常灵活,支持以下几种形式:

- 单个字符:如
a
、 - 字符范围:如
A-Z
、0-9
- 预定义字符类:如
[:alpha:]
、[:punct:]
- 重复字符:如表示字符集1的所有字符重复使用
- 转义序列:如
\n
、\t
预定义字符类的完整列表如下:
[:alnum:]
:字母和数字[:alpha:]
:字母[:ascii:]
:ASCII字符(0-127)[:blank:]
:空格和制表符[:cntrl:]
:控制字符(0-31,127)[:digit:]
:数字(0-9)[:graph:]
:可打印字符(非空格)[:lower:]
:小写字母[:print:]
:可打印字符(含空格)[:punct:]
:标点符号[:space:]
:空白字符(空格、制表符、换行等)[:upper:]
:大写字母[:xdigit:]
:十六进制数字(0-9,a-f,A-F)
需要注意的是,tr命令在处理多字节字符(如UTF-8编码的中文字符)时可能存在局限性,因为它按字节处理字符而非Unicode码点,对于复杂的国际化文本处理,建议使用其他工具如iconv
或perl
。
tr命令的性能特点使其适合处理大量文本数据,由于它是单进程工具,内存占用低,处理速度快,特别适合在管道中作为文本过滤步骤,tr命令不支持正则表达式,对于复杂的模式匹配任务,应结合sed
或awk
等工具使用。
相关问答FAQs
Q1: tr命令和sed命令在字符替换方面有什么区别?
A1: tr命令和sed命令都可以进行字符替换,但存在显著区别,tr命令是简单的字符级转换工具,不支持正则表达式,只能进行一对一或一对多的字符映射,且只能处理标准输入,而sed是流编辑器,支持正则表达式、地址范围、复杂的替换模式(如s/pattern/replacement/g
),可以直接操作文件,将多个连续空格压缩为一个空格,tr命令用tr -s ' '
即可,而sed需要sed 's/ \+/ /g'
,tr命令更适合简单的字符转换任务,而sed适合复杂的文本处理逻辑。
Q2: 如何使用tr命令删除文件中的所有非字母字符?
A2: 要删除文件中的所有非字母字符,可以使用tr命令的补集删除功能,具体命令为tr -d -c '[:alpha:]' < input.txt > output.txt
。-c
选项表示使用字符集的补集(即所有非字母字符),-d
选项表示删除操作,[:alpha:]
表示所有字母字符(包括大小写),处理文件test.txt
内容为"Hello, World! 123",执行该命令后,输出文件将只保留"HelloWorld",如果需要保留空格,可以修改为tr -d -c '[:alpha:] ' < input.txt > output.txt
,在字符集中添加空格。