概述
tr
命令可以将字符进行替换、压缩、删除,即可以将一组字符转换成另外一组字符。tr
的全称是 transform
。
tr
他只能从标准输入中读取数据,因此,tr
要么将输入文件重定向到标准输入,要么从管道读入数据。注意:tr
类似于 sed
命令,但是比 sed
简单,所以 tr
能实现的功能,sed
都能实现。
注:
tr
命令可以将一组大写字母转换成小写字母;删除字符串中的指定字符;压缩多个重复字符为一个。该命令在脚本中也挺常用的。
语法
该命令的语法如下:
tr [选项] [字符集合1] [字符集合2]
'A-Z’
和'a-z '
都是集合。我们可以按照需要追加字符或字符类来构造自己定制的集合。'ABD-} '
、aA.,
、a-ce-x
以及'a-c0-9'
等均是合法的集合。定义集合也很简单,不需要去书写一长串连续的字符序列,相反,我们可以使用“起始字符-终止字符”
这种格式。这种写法也可以和其他宇符或字符类结合使用。如果“起始字符-终止字符”
不是一个连续的字符序列,那么它就会被视为一个包含了三个元素的集合(“起始字符-终止字符”
)。你可以使用像'\t'
、'\n'
这种特殊字符,也可以使用其他 ASCII 字符。
该命令支持的选项有:
选项 | 说明 |
---|---|
-c | 选定字符串1中字符集的补集,即反选字符串1的补集 |
-d | 删除字符串1中出现的所有字符 |
-s | 删除连续重复的字符成指定的单个字符 |
字符集合支持的范围如下:
字符集合 | 说明 |
---|---|
\NNN |
八进制值的字符 NNN |
\\ |
反斜杠 |
\a |
铃声 |
\b |
退格键 |
\f |
走行换页 |
\n |
新行 |
\r |
回车键 |
\t |
制表符 |
\v |
水平制表符 |
CHAR1-CHAR2 |
字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。如 a-z 。 |
[CHAR*] |
这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止 |
[CHAR*REPEAT] |
这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始) |
[:alnum:] |
所有字母字符与数字 |
[:alpha:] |
所有字母字符 |
[:blank:] |
所有水平空格 |
[:cntrl:] |
所有控制字符s |
[:digit:] |
所有数字 |
[:graph:] |
所有可打印的字符(不包含空格符) |
[:lower:] |
所有小写字母 |
[:print:] |
所有可打印的字符(包含空格符) |
[:punct:] |
所有标点字符 |
[:space:] |
所有水平与垂直空格符 |
[:upper:] |
所有大写字母 |
[:xdigit:] |
所有 16 进位制的数字 |
[=CHAR=] |
所有符合指定的字符 |
其实常用的字符范围如下:
字符范围 | 说明 |
---|---|
[a-z] |
所有的小写字母 |
[A-Z] |
所有的大写字母 |
[0-9] |
所有的数字 |
O*n |
表示字符 O 重复出现指定次数 n。因此 [O*2] 匹配 OO 的字符串 |
使用
替换字符串中的字符
我们可以将指定字符串中的字符替换成某个字符串中对应的字符,可以替换字符和文件中的指定字符。语法格式如下:
# 语法
# 替换字符串
echo 字符串 | tr 原字符串 新字符串
# 替换文件中的字符串
cat 指定文件 | tr 原字符串 新字符串
tr 原字符串 新字符串 < 指定文件
# 示例,替换字符串中的字符
echo "hello world" | tr "hello" "xyzmn"
echo "hello world" | tr "hello" "xyz"
cat test.txt | tr "a" "x"
tr "l" "L" < test.txt
注意:
- 并不是用
"xyzmn"
替换原字符串"hello"
,而是将所有出现的h
字符替换成x
字符;将所有出现的e
字符替换成y
字符;将所有出现的l
字符替换成z
字符;将所有出现的l
字符替换成m
字符,如果出现同样的则是后面的字符进行替换;将所有出现的o
字符替换成n
字符。- 字符串 1 中的字符个数与字符串 2 中的字符个数最好一一对应。如果两个字符集的长度不相等,那么 字符串2 会不断重复其最后一个字符,直到长度与 字符串1 相同。如果 字符串2 的长度大于 字符串1,那么在 字符串2 中超出 字符串1 长度的那部分字符则全部被忽略。
转换大小写
可以对字母大小写进行转换,由小写字母转换成大写字母,或由大写字母转换成小写字母。语法格式如下:
# 语法
# 将所有的小写字母转换成大写字母
echo 字符串 | tr [a-z] [A-Z]
# 将所有的大写字母转换成小写字母
echo 字符串 | tr [A-Z] [a-z]
# 替换文件中的字符串
# 将文件中的将所有的小写字母转换成大写字母
cat 指定文件 | tr [a-z] [A-Z]
tr [a-z] [A-Z] < 指定文件
# 将文件中的将所有的大写字母转换成小写字母
cat 指定文件 | tr [A-Z] [a-z]
tr [A-Z] [a-z] < 指定文件
# 示例,替换字符串中的字符
echo "hello world" | tr [a-z] [A-Z]
echo "HELLO WORLD" | tr [A-Z] [a-z]
cat test.txt | tr [a-z] [A-Z]
tr [a-z] [A-Z] < test.txt
cat test.txt | tr [A-Z] [a-z]
tr [A-Z] [a-z] < test.txt
删除字符集合中出现过的所有字符
如果要删除指定字符集合中出现过的所有字符,那么可以使用 -d
选项。语法命令格式如下:
# 语法
# 删除字符串中的某个字符
echo 字符串 | tr -d 指定字符
# 删除字符串中字符集合中出现的所有字符
echo 字符串 | tr -d 指定字符集合
# 删除文件中所有出现的指定字符
cat 指定文件路径 | tr -d 指定字符
tr -d 指定字符 < 指定文件路径
# 删除文件中所有出现的指定字符集合
cat 指定文件路径 | tr -d 指定字符集合
tr -d 指定字符集合 < 指定文件路径
# 示例
# 删除字符串 "hello world" 中所有出现过的 "l" 字符
echo "hello world" | tr -d "l"
# 删除字符串 "hello world" 中所有出现过的 "l"、"o"、"d" 字符,而不是 "lod" 这个字符串
echo "hello world" | tr -d "lod"
# 删除 test.txt 文件中所有的 "l" 字符
cat test.txt | tr -d "l"
tr -d "l" < test.txt
# 删除 test.txt 文件中所有出现过的 "l"、"o"、"d" 字符,而不是 "lod" 这个字符串
cat test.txt | tr -d "lod"
tr -d "lod" < test.txt
删除特殊字符
如果我们要删除换行符、制表符等特殊字符,需要通过转义字符。例如删除所有的换行符和制表符:
# 语法
cat 指定文件路径 | tr -d "\n\t"
# 示例
cat test.txt | tr -d "\n\t"
删除文件所有空行
如果要删除文件中的所有空行,可以用如下语法:
cat 指定文件路径 | tr -d "\r"
# 或者,下面这个是用 "\n" 字符替换所有的 "\r 字符
cat 指定文件路径 | tr -s "\r" "\n"
替换指定字符
如果我们要进行字符的替换,可以使用 -s
选项。替换指定字符的命令格式如下:
# 语法
echo 指定字符串 | tr -s 旧字符 新字符
# 示例,替换环境变量中所有的冒号字符为换行符
echo "$PATH" | tr -s ":" "\n"
字符集补集
字符集补集需要用到 -c
选项,命令格式如下:
tr -c [字符集1]
即 字符集1
的补集意味着从这个集合中包含 字符集1
中没有的所有字符。常用的用法是从输入文本中将不在补集中的所有字符全部删除。例如:
# 删除字符串 "hello 123 world" 中除了数字字符之外的所有字符,因为 "[0-9]" 的补集中包含除了数字字符之外的所有字符(如字母字符等),因为指定了 -d 选项,所以会把补集的所有字符全部删掉,只留下数字字符
echo "hello 123 world" | tr -d -c "[0-9]"
压缩字符
所谓的压缩字符就是如果出现连续重复的多个字符,只保留一个字符。例如字符串 "aaaa"
经过 tr -s
命令后就只剩下一个字符 "a"
了。命令格式如下:
# 语法
echo 字符串 | tr -s 指定压缩字符
# 示例,压缩字符串中的 "a" 字符
echo "abaacaaadaaaae" | tr -s "a"
注:如果想要压缩效果,必须是连续重复的字符才能压缩。