tr的使用

本原創文章屬於《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~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章