Linux tr命令详解

一、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 "\n"   #把重复的换行符压缩成一个,即达到删除空行的效果
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 '#' '\n' #然后把#替换成换行符 Monday Tuesday Wednesday Thursday Friday Saturday Sunday

上面的命令可以简化为:

➜  test cat test.txt|tr -cs "[a-z][A-Z]" "\n"
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

上述命令可以理解为:把所有字母以外的字符替换成换行符,并删除重复的换行符。

 

posted @ 2021-09-26 10:48  白春雨  阅读(2186)  评论(0编辑  收藏  举报