[正文開始]
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就可以了。
本文轉自 linuxtro 51CTO部落格,原文連結:http://blog.51cto.com/linuxtro/986278,如需轉載請自行聯系原作者