linux shell tr命令詳解
linux shell tr命令詳解
tr命令是linux下的一個(gè)命令,那么它的語(yǔ)法和用途是什么呢?下面由學(xué)習(xí)啦小編為大家整理了linux shell tr命令的相關(guān)知識(shí),希望大家喜歡!
linux shell tr命令
tr是translate的簡(jiǎn)寫(xiě),亦即翻譯,但是遺憾的是,它不能翻譯句子,只能翻譯單個(gè)字符。
1 工作原理
先記住一點(diǎn),tr命令不接受指定的文件參數(shù),而只是對(duì)標(biāo)準(zhǔn)輸入進(jìn)行翻譯。好了,記住這點(diǎn)后,我們繼續(xù)。
tr的命令格式是tr SET1 SET2,凡是在SET1中的字符,都會(huì)被替換為SET2中相應(yīng)位置上的字符,簡(jiǎn)單吧!
2 例子
tr的例子其實(shí)都大同小異,看一個(gè)最簡(jiǎn)單的例子:
我們有一個(gè)包含了四個(gè)人身高的數(shù)據(jù)文件,名字叫height.txt,它的內(nèi)容是這樣的:
[rocrocket@rocrocket programming]$ cat height.txt
1.79 1.83
1.65 1.59
我們想搞一個(gè)惡作劇,將所有人的身高從1米級(jí)別都提高到2米級(jí)別,呵呵,一個(gè)tr就可以搞定。
[rocrocket@rocrocket programming]$ tr 1 2 < height.txt
2.79 2.83
2.65 2.59
希望你沒(méi)有忘記,tr只處理標(biāo)準(zhǔn)輸入,所以我們需要將height.txt通過(guò)重定向指到tr的標(biāo)準(zhǔn)輸入才可以。
3 用tr來(lái)修改文件中的間隔符
當(dāng)使用cut的時(shí)候,通常會(huì)被間隔符問(wèn)題所困擾,我們這個(gè)時(shí)候可以考慮到tr這個(gè)命令。
還是以height.txt文件為例,其中的間隔符是空格,我們把它修改為制表符吧!
[rocrocket@rocrocket programming]$ tr ‘ ‘ ‘′ < height.txt
1.79 1.83
1.65 1.59
這里有一個(gè)小知識(shí)點(diǎn),像制表符、換行符這些字符不好表示,我們可以考慮使用ASCII的八進(jìn)制形式來(lái)表示,制表符的八進(jìn)制形式是11,回車(chē)是15,換行是12。而在tr命令中,可以使用\nnn形式表示八進(jìn)制形式的字符。如果你實(shí)在記不住這些編號(hào),那么用\t表示制表符你總該可以記住吧!(\n代表新行,\r代表回車(chē))
這下,你應(yīng)該可以理解上面那條命令的作用了吧。如果你仍然懷疑,那么,看看下面這條命令,你就該心服口服了:
[rocrocket@rocrocket programming]$ tr ‘ ‘ ‘′ < height.txt |sed -n l
1.79\t1.83$
1.65\t1.59$
看!空格的的確確被替換成了制表符嘍!
4 使用tr把文章中的小寫(xiě)都轉(zhuǎn)換成大寫(xiě)
這個(gè)正是tr所擅長(zhǎng)的地方。
加入我們擁有一個(gè)文件叫做word.txt,里面包含的內(nèi)容是AbcdE。
那么最簡(jiǎn)單的替換大小寫(xiě)的方法是:
[rocrocket@rocrocket programming]$ cat word.txt
AbcdE
[rocrocket@rocrocket programming]$ tr ‘a-z’ ‘A-Z’ < word.txt
ABCDE
5 [CHAR*]
這是 SET2 專(zhuān)用的設(shè)定,功能是重復(fù)指定的字符到與 SET1 相同長(zhǎng)度為止
例子:
[rocrocket@rocrocket programming]$ cat number.txt
1234567890
[rocrocket@rocrocket programming]$ tr ‘1-5′ ‘[A*]‘ < number.txt
AAAAA67890
6 [CHAR*REPEAT]
這也是SET2專(zhuān)用的設(shè)定,功能是將CHAR重復(fù)REPEAT次數(shù)。其中REPEAT次數(shù)可以用八進(jìn)制數(shù)表示,但記得要以0開(kāi)頭表示八進(jìn)制數(shù)。
例子:
[rocrocket@rocrocket programming]$ tr ‘1-9′ ‘[A*5]BCDE’ < number.txt
AAAAABCDE0
7 在tr中表示集合的符號(hào)
[:alnum:] :所有字母字符與數(shù)字
[:alpha:] :所有字母字符
[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:digit:] :所有數(shù)字
[:graph:] :所有可打印的字符(不包含空格符)
[:lower:] :所有小寫(xiě)字母
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有標(biāo)點(diǎn)字符
[:space:] :所有水平與垂直空格符
[:upper:] :所有大寫(xiě)字母
[:xdigit:] :所有 16 進(jìn)位制的數(shù)字
例子:
將所有的數(shù)字都轉(zhuǎn)換為字符x。
[rocrocket@rocrocket programming]$ tr [:alnum:] ‘[x*]‘ < number.txt
xxxxxxxxxx
8 tr里面包含SET1和SET2,那如果出現(xiàn)兩個(gè)集合的大小不同的情況,tr如何處理
這個(gè)問(wèn)題,最好的解決辦法就是做實(shí)驗(yàn)啊。
第一種情況是SET1>SET2:
[rocrocket@rocrocket programming]$ tr 1-5 AB < number.txt
ABBBB67890
結(jié)論一下子就出來(lái)了,SET1中多出來(lái)的字符都會(huì)和SET2中最后一個(gè)字符相對(duì)應(yīng)。
第二種情況SET1
[rocrocket@rocrocket programming]$ tr 1-3 ABCDE < number.txt
ABC4567890
很明了,SET2中多余的部分將被拋棄。
9 tr命令的-s選項(xiàng)
這個(gè)-s選項(xiàng),是專(zhuān)門(mén)針對(duì)SET1起作用的,意思是如果發(fā)現(xiàn)有連續(xù)的SET1里的字符,就把它們縮減為1個(gè)。
一個(gè)很經(jīng)典的應(yīng)用就是把不規(guī)律的空格縮減為一個(gè)空格:
[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!
效果很明顯,用戶(hù)很滿(mǎn)意。恩!
10 -d選項(xiàng)
-d選項(xiàng)是用來(lái)刪除字符用的。格式是這樣的:tr -d charset
[rocrocket@rocrocket programming]$ tr -d ‘ ‘ < spaces.txt
Howareyou?
Fine!Thankyou!
看,該有的空格都沒(méi)了…這就是-d的作用,把空格都刪除了!
如果你想把文章中的數(shù)字都刪除,就tr -d [0-9] < filename就可以了。
語(yǔ)法:
tr [options] [source-char-list] [replace-char-list] < filename
用途:
轉(zhuǎn)換字符,例如:將大寫(xiě)字符轉(zhuǎn)換成小寫(xiě)字符。選項(xiàng)可以讓你指定所要?jiǎng)h除的字符,以及將一串重復(fù)出現(xiàn)的字符濃縮成一個(gè)。
常用選項(xiàng):
-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里所列的字符,則將其濃縮成一個(gè)?;蛘邔⑵錆饪s成replace-char-list中的字符。
tr 'X' 'x' 把所有大寫(xiě)X轉(zhuǎn)換成小寫(xiě)x
tr '()' '{}' 把( )替換成{ }
tr '[a-z]' '[A-Z]' 把所有小寫(xiě)字母變成大寫(xiě)字母
tr '[A-Z]' '[N-ZA-M]' 把字符A-M分別轉(zhuǎn)換成N-Z,而N-Z轉(zhuǎn)換成A-M
tr -s ' ' ' ' 把多個(gè)空格轉(zhuǎn)換成單個(gè)空格
tr -d '[0-9]' 刪除所有數(shù)字
引用:[a-z] a-z內(nèi)的字符組成的字符串。
[A-Z] A-Z內(nèi)的字符組成的字符串。
[0-9] 數(shù)字串。
/octal 一個(gè)三位的八進(jìn)制數(shù),對(duì)應(yīng)有效的A S C I I字符。
[O*n] 表示字符O重復(fù)出現(xiàn)指定次數(shù)n。因此[ O * 2 ]匹配O O的字符串。
大部分t r變種支持字符類(lèi)和速記控制字符。
字符類(lèi)格式為[:c l a s s ],包含數(shù)字、希臘字母、空行、小寫(xiě)、大寫(xiě)、c n t r l鍵、空格、點(diǎn)記符、圖形等等。
下表包括最常用的控制字符的速記方式及三位八進(jìn)制引用方式。
當(dāng)用一個(gè)單字符替換一個(gè)字符串或字符范圍時(shí),注意字符并不放在方括號(hào)里( [ ])。一些系統(tǒng)也可以使用方括號(hào),例如可以寫(xiě)成[“\ 0 1 2”]或“\ 0 1 2”,t r也允許不加引號(hào),因此命令中看到單引號(hào)而不是雙引號(hào)時(shí)也不要感到奇怪。
像大多數(shù)系統(tǒng)工具一樣, t r也受特定字符的影響。因此如果要匹配這些字符,需使用反斜線(xiàn)屏蔽其特殊含義。例如,用\ {指定花括號(hào)左邊可以屏蔽其特殊含義。
代碼:
速記符含義八進(jìn)制方式
\ a Ctrl-G 鈴聲\ 0 0 7
\ b Ctrl-H 退格符\ 0 1 0
\f Ctrl-L 走行換頁(yè)\ 0 1 4
\n Ctrl-J 新行\(zhòng) 0 1 2
\ r Ctrl-M 回車(chē)\ 0 1 5
\t Ctrl-I tab鍵\ 0 11
\ v Ctrl-X \ 0 3 0
去除重復(fù)出現(xiàn)的字符
下面文件包含了一些打印錯(cuò)誤。這種情況時(shí)常發(fā)生,例如在v i編輯器中,偶爾按住一個(gè)鍵不放。
代碼:
And the cowwwwws went homeeeeeeeeeeeee
Or did theyyyyyyyyyyyyy
如果要去除重復(fù)字母或?qū)⑵鋲嚎s在一起,使用- s選項(xiàng)。因?yàn)槎际亲帜福适褂肹 a - z ][A-Z]。輸入文件重定向到t r命令。
dtdlut@dtdlut:~$ tr -s "[a-z][A-Z]" < apps.txt
And the cows went home
Or did they
刪除空行
要?jiǎng)h除空行,可將之剔出文件。下面是一個(gè)文件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
大寫(xiě)到小寫(xiě)
除了刪除控制字符,轉(zhuǎn)換大小寫(xiě)是t r最常用的功能。為此需指定即將轉(zhuǎn)換的小寫(xiě)字符[ a - z ]和轉(zhuǎn)換結(jié)果[ A - Z ]。
第一個(gè)例子,t r從一個(gè)包含大小寫(xiě)字母的字符串中接受輸入。
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..
刪除指定字符
偶爾會(huì)從下載文件中刪除只包含字母或數(shù)字的列。需要結(jié)合使用- c和- s選項(xiàng)完成此功能。
下 面的文件包含一個(gè)星期的日程表。任務(wù)是從其中刪除所有數(shù)字,只保留日期。日期有大寫(xiě),也有小寫(xiě)格式。因此需指定兩個(gè)字符范圍[ a - z ]和[ A - Z ],命令tr -cs "[a-z][A-Z]" "\n"將文件每行所有不包含在[ a - z ]或[ A - Z ](所有希臘字母)的字符串放在字符串replace-char-list中并轉(zhuǎn)換為一新行。- s選項(xiàng)表明壓縮所有新行, - 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