一、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
上述命令可以理解為:把所有字母以外的字符替換成換行符,並刪除重復的換行符。