天天看點

tr指令

 [正文開始]

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,如需轉載請自行聯系原作者