本原創文章屬於《Linux大棚》博客,博客地址爲http://roclinux.cn。文章作者爲rocrocket。
爲了防止某些網站的惡性轉載,特在每篇文章前加入此信息,還望讀者體諒。
===
[正文開始]
tr是translate的簡寫,亦即翻譯,但是遺憾的是,它不能翻譯句子,只能翻譯單個字符。
1 tr的工作原理是什麼?
先記住一點,tr命令不接受指定的文件參數,而只是對標準輸入進行翻譯。好了,記住這點後,我們繼續。
tr的命令格式是tr SET1 SET2,凡是在SET1中的字符,都會被替換爲SET2中相應位置上的字符,簡單吧!
2 舉個例子吧!
tr的例子其實都大同小異,看一個最簡單的例子:
我們有一個包含了四個人身高的數據文件,名字叫height.txt,它的內容是這樣的:
[rocrocket@rocrocket programming]$ cat height.txt
1.79 1.83
1.65 1.59
我們想搞一個惡作劇,將所有人的身高從1米級別都提高到2米級別,呵呵,一個tr就可以搞定。
[rocrocket@rocrocket programming]$ tr 1 2 < height.txt
2.79 2.83
2.65 2.59
希望你沒有忘記,tr只處理標準輸入,所以我們需要將height.txt通過重定向指到tr的標準輸入纔可以。
3 我們可以用tr來修改文件中的間隔符麼?
Good idea!
當使用cut的時候,通常會被間隔符問題所困擾,我們這個時候可以考慮到tr這個命令。
還是以height.txt文件爲例,其中的間隔符是空格,我們把它修改爲製表符吧!
[rocrocket@rocrocket programming]$ tr ‘ ‘ ‘\11′ < height.txt
1.79 1.83
1.65 1.59
這裏有一個小知識點,像製表符、換行符這些字符不好表示,我們可以考慮使用ASCII的八進制形式來表示,製表符的八進制形式是11,回車是15,換行是12。而在tr命令中,可以使用\nnn形式表示八進制形式的字符。如果你實在記不住這些編號,那麼用\t表示製表符你總該可以記住吧!(\n代表新行,\r代表回車)
這下,你應該可以理解上面那條命令的作用了吧。如果你仍然懷疑,那麼,看看下面這條命令,你就該心服口服了:
[rocrocket@rocrocket programming]$ tr ‘ ‘ ‘\11′ < height.txt |sed -n l
1.79\t1.83$
1.65\t1.59$
看!空格的的確確被替換成了製表符嘍!
4 使用tr能把文章中的小寫都轉換成大寫麼?
這個正是tr所擅長的地方。
加入我們擁有一個文件叫做word.txt,裏面包含的內容是AbcdE。
那麼最簡單的替換大小寫的方法是:
[rocrocket@rocrocket programming]$ cat word.txt
AbcdE
[rocrocket@rocrocket programming]$ tr ‘a-z’ ‘A-Z’ < word.txt
ABCDE
5 [CHAR*]怎麼用?
這是 SET2 專用的設定,功能是重複指定的字符到與 SET1 相同長度爲止
例子:
[rocrocket@rocrocket programming]$ cat number.txt
1234567890
[rocrocket@rocrocket programming]$ tr ‘1-5′ ‘[A*]‘ < number.txt
AAAAA67890
6 [CHAR*REPEAT]怎麼用?
這也是SET2專用的設定,功能是將CHAR重複REPEAT次數。其中REPEAT次數可以用八進制數表示,但記得要以0開頭表示八進制數。
例子:
[rocrocket@rocrocket programming]$ tr ‘1-9′ ‘[A*5]BCDE’ < number.txt
AAAAABCDE0
7 在tr中還有哪些表示集合的符號呢?
[:alnum:] :所有字母字符與數字
[:alpha:] :所有字母字符
[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:digit:] :所有數字
[:graph:] :所有可打印的字符(不包含空格符)
[:lower:] :所有小寫字母
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有標點字符
[:space:] :所有水平與垂直空格符
[:upper:] :所有大寫字母
[:xdigit:] :所有 16 進位制的數字
例子:
將所有的數字都轉換爲字符x。
[rocrocket@rocrocket programming]$ tr [:alnum:] ‘[x*]‘ < number.txt
xxxxxxxxxx
8 tr裏面包含SET1和SET2,那如果出現兩個集合的大小不同的情況,tr如何處理呢?
這個問題,最好的解決辦法就是做實驗啊。
第一種情況是SET1>SET2:
[rocrocket@rocrocket programming]$ tr 1-5 AB < number.txt
ABBBB67890
結論一下子就出來了,SET1中多出來的字符都會和SET2中最後一個字符相對應。
第二種情況SET1<SET2:
[rocrocket@rocrocket programming]$ tr 1-3 ABCDE < number.txt
ABC4567890
很明瞭,SET2中多餘的部分將被拋棄。
9 講一講tr命令的-s選項吧!
這個-s選項,是專門針對SET1起作用的,意思是如果發現有連續的SET1裏的字符,就把它們縮減爲1個。
一個很經典的應用就是把不規律的空格縮減爲一個空格:
[rocrocket@rocrocket programming]$ cat spaces.txt
How are you?
Fine! Thank you!
[rocrocket@rocrocket programming]$ tr -s ‘ ‘ ‘ ‘ < spaces.txt
How are you?
Fine! Thank you!
效果很明顯,用戶很滿意。恩!
10 -d選項咋用?
-d選項是用來刪除字符用的。格式是這樣的:tr -d charset
[rocrocket@rocrocket programming]$ tr -d ‘ ‘ < spaces.txt
Howareyou?
Fine!Thankyou!
看,該有的空格都沒了…這就是-d的作用,把空格都刪除了!
如果你想把文章中的數字都刪除,就tr -d [0-9] < filename就可以了。
Translation occurs if -d is not given and both SET1 and SET2 appear.
-t may be used only when translating. SET2 is extended to length of
SET1 by repeating its last character as necessary. Excess characters
of SET2 are ignored. Only [:lower:] and [:upper:] are guaranteed to
expand in ascending order; used in SET2 while translating, they may
only be used in pairs to specify case conversion. -s uses SET1 if not
translating nor deleting; else squeezing uses SET2 and occurs after
translation or deletion.
-d 選項不需要 SET1 和SET2.但是-t需要。SET2擴展到SET1的長度通過重複它的最後一個字符(SET1長於SET2),超過的字符忽略(SET2長於SET1).[:lower:] and [:upper:] 同時使用用於大小寫轉換。
ps: 看似tr只有兩個字母,不過這個命令的功能卻不少,可不能小覷,不過,讀過本文,搞定tr也就不在話下了:D
over~