學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 操作系統(tǒng) > Linux教程 > linux shell tr命令詳解

linux shell tr命令詳解

時間: 佳洲1085 分享

linux shell tr命令詳解

  tr命令是linux下的一個命令,那么它的語法和用途是什么呢?下面由學(xué)習(xí)啦小編為大家整理了linux shell tr命令的相關(guān)知識,希望大家喜歡!

  linux shell tr命令

  tr是translate的簡寫,亦即翻譯,但是遺憾的是,它不能翻譯句子,只能翻譯單個字符。

  1 工作原理

  先記住一點,tr命令不接受指定的文件參數(shù),而只是對標(biāo)準(zhǔn)輸入進(jìn)行翻譯。好了,記住這點后,我們繼續(xù)。

  tr的命令格式是tr SET1 SET2,凡是在SET1中的字符,都會被替換為SET2中相應(yīng)位置上的字符,簡單吧!

  2 例子

  tr的例子其實都大同小異,看一個最簡單的例子:

  我們有一個包含了四個人身高的數(shù)據(jù)文件,名字叫height.txt,它的內(nèi)容是這樣的:

  [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只處理標(biāo)準(zhǔn)輸入,所以我們需要將height.txt通過重定向指到tr的標(biāo)準(zhǔn)輸入才可以。

  3 用tr來修改文件中的間隔符

  當(dāng)使用cut的時候,通常會被間隔符問題所困擾,我們這個時候可以考慮到tr這個命令。

  還是以height.txt文件為例,其中的間隔符是空格,我們把它修改為制表符吧!

  [rocrocket@rocrocket programming]$ tr ‘ ‘ ‘′ < height.txt

  1.79 1.83

  1.65 1.59

  這里有一個小知識點,像制表符、換行符這些字符不好表示,我們可以考慮使用ASCII的八進(jìn)制形式來表示,制表符的八進(jìn)制形式是11,回車是15,換行是12。而在tr命令中,可以使用\nnn形式表示八進(jìn)制形式的字符。如果你實在記不住這些編號,那么用\t表示制表符你總該可以記住吧!(\n代表新行,\r代表回車)

  這下,你應(yīng)該可以理解上面那條命令的作用了吧。如果你仍然懷疑,那么,看看下面這條命令,你就該心服口服了:

  [rocrocket@rocrocket programming]$ tr ‘ ‘ ‘′ < height.txt |sed -n l

  1.79\t1.83$

  1.65\t1.59$

  看!空格的的確確被替換成了制表符嘍!

  4 使用tr把文章中的小寫都轉(zhuǎn)換成大寫

  這個正是tr所擅長的地方。

  加入我們擁有一個文件叫做word.txt,里面包含的內(nèi)容是AbcdE。

  那么最簡單的替換大小寫的方法是:

  [rocrocket@rocrocket programming]$ cat word.txt

  AbcdE

  [rocrocket@rocrocket programming]$ tr ‘a-z’ ‘A-Z’ < word.txt

  ABCDE

  5 [CHAR*]

  這是 SET2 專用的設(shè)定,功能是重復(fù)指定的字符到與 SET1 相同長度為止

  例子:

  [rocrocket@rocrocket programming]$ cat number.txt

  1234567890

  [rocrocket@rocrocket programming]$ tr ‘1-5′ ‘[A*]‘ < number.txt

  AAAAA67890

  6 [CHAR*REPEAT]

  這也是SET2專用的設(shè)定,功能是將CHAR重復(fù)REPEAT次數(shù)。其中REPEAT次數(shù)可以用八進(jìn)制數(shù)表示,但記得要以0開頭表示八進(jìn)制數(shù)。

  例子:

  [rocrocket@rocrocket programming]$ tr ‘1-9′ ‘[A*5]BCDE’ < number.txt

  AAAAABCDE0

  7 在tr中表示集合的符號

  [:alnum:] :所有字母字符與數(shù)字

  [:alpha:] :所有字母字符

  [:blank:] :所有水平空格

  [:cntrl:] :所有控制字符

  [:digit:] :所有數(shù)字

  [:graph:] :所有可打印的字符(不包含空格符)

  [:lower:] :所有小寫字母

  [:print:] :所有可打印的字符(包含空格符)

  [:punct:] :所有標(biāo)點字符

  [:space:] :所有水平與垂直空格符

  [:upper:] :所有大寫字母

  [:xdigit:] :所有 16 進(jìn)位制的數(shù)字

  例子:

  將所有的數(shù)字都轉(zhuǎn)換為字符x。

  [rocrocket@rocrocket programming]$ tr [:alnum:] ‘[x*]‘ < number.txt

  xxxxxxxxxx

  8 tr里面包含SET1和SET2,那如果出現(xiàn)兩個集合的大小不同的情況,tr如何處理

  這個問題,最好的解決辦法就是做實驗啊。

  第一種情況是SET1>SET2:

  [rocrocket@rocrocket programming]$ tr 1-5 AB < number.txt

  ABBBB67890

  結(jié)論一下子就出來了,SET1中多出來的字符都會和SET2中最后一個字符相對應(yīng)。

  第二種情況SET1

  [rocrocket@rocrocket programming]$ tr 1-3 ABCDE < number.txt

  ABC4567890

  很明了,SET2中多余的部分將被拋棄。

  9 tr命令的-s選項

  這個-s選項,是專門針對SET1起作用的,意思是如果發(fā)現(xiàn)有連續(xù)的SET1里的字符,就把它們縮減為1個。

  一個很經(jīng)典的應(yīng)用就是把不規(guī)律的空格縮減為一個空格:

  [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的作用,把空格都刪除了!

  如果你想把文章中的數(shù)字都刪除,就tr -d [0-9] < filename就可以了。

  語法:

  tr [options] [source-char-list] [replace-char-list] < filename

  用途:

  轉(zhuǎn)換字符,例如:將大寫字符轉(zhuǎn)換成小寫字符。選項可以讓你指定所要刪除的字符,以及將一串重復(fù)出現(xiàn)的字符濃縮成一個。

  常用選項:

  -c: 取source-char-list的反義,所有不在source-char-list中的字符。常與-d , -s配合使用。

  -d: 刪除source-char-list中所定義的字符。

  -s: 濃縮重復(fù)的字符。如果標(biāo)準(zhǔn)輸入中連續(xù)重復(fù)出現(xiàn)source-char-list里所列的字符,則將其濃縮成一個?;蛘邔⑵錆饪s成replace-char-list中的字符。

  tr 'X' 'x' 把所有大寫X轉(zhuǎn)換成小寫x

  tr '()' '{}' 把( )替換成{ }

  tr '[a-z]' '[A-Z]' 把所有小寫字母變成大寫字母

  tr '[A-Z]' '[N-ZA-M]' 把字符A-M分別轉(zhuǎn)換成N-Z,而N-Z轉(zhuǎn)換成A-M

  tr -s ' ' ' ' 把多個空格轉(zhuǎn)換成單個空格

  tr -d '[0-9]' 刪除所有數(shù)字

  引用:[a-z] a-z內(nèi)的字符組成的字符串。

  [A-Z] A-Z內(nèi)的字符組成的字符串。

  [0-9] 數(shù)字串。

  /octal 一個三位的八進(jìn)制數(shù),對應(yīng)有效的A S C I I字符。

  [O*n] 表示字符O重復(fù)出現(xiàn)指定次數(shù)n。因此[ O * 2 ]匹配O O的字符串。

  大部分t r變種支持字符類和速記控制字符。

  字符類格式為[:c l a s s ],包含數(shù)字、希臘字母、空行、小寫、大寫、c n t r l鍵、空格、點記符、圖形等等。

  下表包括最常用的控制字符的速記方式及三位八進(jìn)制引用方式。

  當(dāng)用一個單字符替換一個字符串或字符范圍時,注意字符并不放在方括號里( [ ])。一些系統(tǒng)也可以使用方括號,例如可以寫成[“\ 0 1 2”]或“\ 0 1 2”,t r也允許不加引號,因此命令中看到單引號而不是雙引號時也不要感到奇怪。

  像大多數(shù)系統(tǒng)工具一樣, t r也受特定字符的影響。因此如果要匹配這些字符,需使用反斜線屏蔽其特殊含義。例如,用\ {指定花括號左邊可以屏蔽其特殊含義。

  代碼:

  速記符含義八進(jìn)制方式

  \ a Ctrl-G 鈴聲\ 0 0 7

  \ b Ctrl-H 退格符\ 0 1 0

  \f Ctrl-L 走行換頁\ 0 1 4

  \n Ctrl-J 新行\(zhòng) 0 1 2

  \ r Ctrl-M 回車\ 0 1 5

  \t Ctrl-I tab鍵\ 0 11

  \ v Ctrl-X \ 0 3 0

  去除重復(fù)出現(xiàn)的字符

  下面文件包含了一些打印錯誤。這種情況時常發(fā)生,例如在v i編輯器中,偶爾按住一個鍵不放。

  代碼:

  And the cowwwwws went homeeeeeeeeeeeee

  Or did theyyyyyyyyyyyyy

  如果要去除重復(fù)字母或?qū)⑵鋲嚎s在一起,使用- s選項。因為都是字母,故使用[ a - z ][A-Z]。輸入文件重定向到t r命令。

  dtdlut@dtdlut:~$ tr -s "[a-z][A-Z]" < apps.txt

  And the cows went home

  Or did they

  刪除空行

  要刪除空行,可將之剔出文件。下面是一個文件p l a n e . t x t。文本間有許多空行。

  plane.txt

  9879932 Spitfire

  190992 Lancaster

  238991 Typhoon

  dtdlut@dtdlut:~$ tr -s "\n" < plane.txt

  plane.txt

  9879932 Spitfire

  190992 Lancaster

  238991 Typhoon

  大寫到小寫

  除了刪除控制字符,轉(zhuǎn)換大小寫是t r最常用的功能。為此需指定即將轉(zhuǎn)換的小寫字符[ a - z ]和轉(zhuǎn)換結(jié)果[ A - Z ]。

  第一個例子,t r從一個包含大小寫字母的字符串中接受輸入。

  tr "[a-z]" "[A-Z]" 或者 tr "[:lower:]" "[:upper:]"

  dtdlut@dtdlut:~$ echo "May Day,May Day,Going Down.." | tr "[a-z]" "[A-Z]"

  MAY DAY,MAY DAY,GOING DOWN..

  刪除指定字符

  偶爾會從下載文件中刪除只包含字母或數(shù)字的列。需要結(jié)合使用- c和- s選項完成此功能。

  下 面的文件包含一個星期的日程表。任務(wù)是從其中刪除所有數(shù)字,只保留日期。日期有大寫,也有小寫格式。因此需指定兩個字符范圍[ a - z ]和[ A - Z ],命令tr -cs "[a-z][A-Z]" "\n"將文件每行所有不包含在[ a - z ]或[ A - Z ](所有希臘字母)的字符串放在字符串replace-char-list中并轉(zhuǎn)換為一新行。- s選項表明壓縮所有新行, - c表明取source-char-list的反義。

  dtdlut@dtdlut:~$ cat diray.txt

  mondy 1all0:5b0

  Tuesday 15:00

  wednesday 15:30

  thurday 10:30

  Fridya 09:20

  dtdlut@dtdlut:~$ tr -cs "[a-z][A-Z]" "\n" < diray.txt

  mondy

  all

  b

  Tuesday

  wednesday

  thurday

  Fridya

3575262