首頁 > 軟體

Linux下的tr文字處理命令詳解

2020-06-16 16:39:09

Linux下通過使用 tr文字處理命令,您可以非常容易地實現 sed 的許多最基本功能。您可以將 tr 看作為 sed 的(極其)簡化的變體:它可以用一個字元來替換另一個字元,或者可以完全除去一些字元。您也可以用它來除去重複字元。這就是所有 tr 所能夠做的。

命令格式

tr [option] ["string1"] ["string2"] < file 
常用的選項有:
預設選項。就是沒有任何選項的時候,tr預設為替換操作,就是將string1在檔案中出現的字元替換為string2中的字元,這裡要注意的是替換關係。
-c選項,用string1中字元的補集替換string1,這裡的字元集為ASCII。
-d選項,刪除檔案中所有在string1中出現的字元。
-s選項,刪除檔案中重複並且在string1中出現的字元,只保留一個。
-c選項在使用時,只是將string1替換為現在的補集,如在使用

linuxidc@Ubuntu:~/linuxidc.com$ echo "hello world,linuxidc.com,2019" | tr -c "0-9" "*"
*************************2019*

linuxidc@ubuntu:~/linuxidc.com$ echo "hello world,linuxidc.com,2019" | tr "0-9" "*"
hello world,linuxidc.com,****

可以看出,我們使用0-9,新增-c選項後,會把0-9替換為其補集,這時補集自然不包含0-9,而包含很多其它的字元,接下來就把所有的其它字元都替換成*號,但不包含數位。

字串的取值範圍
指定string或string2的內容時,只能使用單字元或字串範圍或列表。
[a-z] a-z內的字元組成的字串。
[A-Z] A-Z內的字元組成的字串。
[0-9] 數位串。
octal 一個三位的八進位制數,對應有效的ASCII字元。
[O*n] 表示字元O重複出現指定次數n。因此[O*2]匹配OO的字串。

控制字元的不同表達方式

速記符 含義 八進位制方式
a Ctrl-G  鈴聲07
b Ctrl-H 退格符10
f Ctrl-L  走行換頁14
n Ctrl-J  新行12
r Ctrl-M 回車15
t  Ctrl-I  tab鍵11
v Ctrl-X 30 注意這些控制字元,如果想在linux下輸入,如我們可能需要輸入^M這種字元,只需ctrl+V+M同時按下即可。

字元替換

linuxidc@ubuntu:~/linuxidc.com$ echo "hello world,www.linuxidc.com" | tr "a-z" "A-Z"
HELLO WORLD,WWW.LINUXIDC.COM
linuxidc@ubuntu:~/linuxidc.com$ echo "hello world,www.linuxidc.com" | tr "a-l" "A-Z"
HELLo worLD,www.LInuxIDC.Com
linuxidc@ubuntu:~/linuxidc.com$ echo "hello world,www.linuxidc.com" | tr "a-z" "A-H"
HEHHH HHHHD,HHH.HHHHHHDC.CHH

第一行輸出就是將小寫換成大寫。
第二行輸出將小寫中的a-l分別換成A-L,而將小寫中的l以後的字元都不替換。
第三行輸出將小寫中的a-h換成A-H,而h以後的字元都換成H,因為後者的替換空間沒有前面的字元空間大,所以就重複後面的H,相當於後面的字元是A-HHH......HHHHH。

如果我們想要進行大小寫轉換,可以按下面的輸入:
tr "a-z" "A-Z" < inputfile 

去除重複字元
這個時候,所用的選項是-s選項,如:

linuxidc@ubuntu:~/linuxidc.com$ echo "root,hello world,linuxidc.com" | tr -s "ao" 
rot,hello world,linuxidc.com
linuxidc@ubuntu:~/linuxidc.com$ echo "root,hello world,linuxidc.com" | tr -s "lo" 
rot,helo world,linuxidc.com
linuxidc@ubuntu:~/linuxidc.com$ echo "root,hello world,linuxidc.com" | tr -s "a-z"
rot,helo world,linuxidc.com
linuxidc@ubuntu:~/linuxidc.com$ echo "root,hello world,linuxidc.com" | tr -s "0-9"
root,hello world,linuxidc.com

第一行表示將輸入字串中的包含在"ao"字元集中的重複字元去掉,只留一個。因為"hello world,linuxidc.com",只有o滿足條件,所以將linuxidc.com變成rot,把中間的兩個o變成一個。
第二行將hello和linuxidc.com兩個字元都壓縮了。
第三行表示將a-z中的除複字元都去掉。
第三行表示將字串中的重複的且重複字元在0-9字元集中的字元去掉,這裡沒有。

如果我們想要去掉空行,可以這樣操作:
tr -s "n" < inputfile 或者 tr -s "12" <inputfile // 這兩個是一樣的。 
就是將重複的換行符去掉,只留一個。

刪除字元
-d選項和-s選項類似,只不過-d選項會刪除所有出現的字元。

linuxidc@ubuntu:~/linuxidc.com$ echo "root,hello world,linuxidc.com" | tr -d "a-h" 
root,llo worl,linuxi.om
linuxidc@ubuntu:~/linuxidc.com$ echo "root,hello world,linuxidc.com,2019" | tr -d "a-z" 
, ,.,2019
linuxidc@ubuntu:~/linuxidc.com$ echo "root,hello world,linuxidc.com,2019" | tr -d "0-9" 
root,hello world,linuxidc.com,


IT145.com E-mail:sddin#qq.com