一、tr命令介绍
tr是translate的简写,主要用于压缩重复字符、删除文件中的指定字符以及进行字符替换操作。tr命令只会对修改后的内容进行输出,并不会修改原文件。tr命令的格式如下:
tr [OPTION] SET1 [SET2]
tr命令常用的选项如下表所示:
选项 | 功能 |
-s | 压缩重复字符:用SET1指定的字符来替换对应的重复字符 |
-d | 删除指定字符:删除SET1中指定的所有字符 |
-t | 替换字符:将SET1中字符用SET2对应位置的字符进行替换(缺省就是-t选项) |
-c | 字符补集替换:用SET2替换SET1中没有包含的字符 |
二、tr命令详解
2.1、压缩重复字符
可以使用-s选项来压缩重复字符,用SET1指定的字符来替换对应的重复字符:
➜ test echo "aaabbbaacccfddd" | tr -s '[abcdf]' abacfd
在上述命令中,用'[abcdf]'来替换与之对应的重复字符,并将替换后的字符串输出。使用-s选项也可以删除空行:
➜ test cat test.txt Monday 09:00 Tuesday 09:10 Wednesday 10:11 Thursday 11:30 Friday 08:00 Saturday 07:40 Sunday 10:00 ➜ test cat test.txt|tr -s " " #把重复的换行符压缩成一个,即达到删除空行的效果 Monday 09:00 Tuesday 09:10 Wednesday 10:11 Thursday 11:30 Friday 08:00 Saturday 07:40 Sunday 10:00
2.2、删除指定字符
可以使用-d选项来删除SET1中指定的字符:
➜ test echo "a12HJ13fdaADff" | tr -d "[a-z][A-Z]" 1213 ➜ test echo "a1213fdasf" | tr -d '[adfs]' 1213
在上述命令中,用正则表达式来匹配要删除的字符。第一个命令,删除所有的大小写字母;第二个命令,删除匹配'[adfs]'的字符。
2.3、字符替换
用-t选项可以来替换字符,它会把SET1中字符用SET2对应位置的字符进行替换:
➜ test echo "a1213fdasf" | tr -t '[afd]' '[AFD]' A1213FDAsF ➜ test echo "Hello World I Love You" |tr -t '[:lower:]' '[:upper:]' #也可以写成:echo "Hello World ..." | tr -t '[a-z]' '[A-Z]' 效果一样 HELLO WORLD I LOVE YOU
在第一个命令中,把所有的a、f、d替换成相应的大写字母,这里是字符替换,而不是将字符串"afd"替换成字符串"AFD";在第二个命令中,把所有的小写字母替换成大写字母。PS:[:upper:] 和[:lower:] 是字符集的形式,其他字符集形式如下表:
字符集 | 含义 |
[:alnum:] | 所有的字母和数字 |
[:alpha:] | 所有字母 |
[:blank:] | 水平制表符,空白等 |
[:cntrl:] | 所有控制字符 |
[:digit:] | 所有的数字 |
[:graph:] | 所有可打印字符,不包括空格 |
[:lower:] | 所有小写字母 |
[:upper:] | 所有大写字母 |
[:print:] | 所有可打印字符,包括空格 |
[:punct:] | 所有的标点字符 |
[:space:] | 所有的横向或纵向的空白 |
2.4、字符补集替换
可以使用-c选项来进行字符补集替换,它会用SET2替换SET1中没有包含的字符:
➜ test cat test.txt Monday 09:00 Tuesday 09:10 Wednesday 10:11 Thursday 11:30 Friday 08:00 Saturday 07:40 Sunday 10:00
➜ test cat test.txt|tr -c '[a-z][A-Z]' '#' #该命令会把文件中除了字母以外的其他所有字符都替换成"#"(包括换行符) Monday#########Tuesday########Wednesday#######Thursday########Friday#########Saturday########Sunday#########%
➜ test cat test.txt|tr -c '[a-z][A-Z]' '#'|tr -s '#' #然后把重复的#压缩一下 Monday#Tuesday#Wednesday#Thursday#Friday#Saturday#Sunday#%
➜ test cat test.txt|tr -c '[a-z][A-Z]' '#'|tr -s '#'|tr -t '#' ' ' #然后把#替换成换行符 Monday Tuesday Wednesday Thursday Friday Saturday Sunday
上面的命令可以简化为:
➜ test cat test.txt|tr -cs "[a-z][A-Z]" " " Monday Tuesday Wednesday Thursday Friday Saturday Sunday
上述命令可以理解为:把所有字母以外的字符替换成换行符,并删除重复的换行符。