利用tr命令輕松實(shí)現(xiàn)大小寫轉(zhuǎn)換
系統(tǒng)工程師有時(shí)候在系統(tǒng)維護(hù)的時(shí)候,需要將某個(gè)文件中的內(nèi)容進(jìn)行大小寫的轉(zhuǎn)換。如系統(tǒng)工程師從網(wǎng)上下載了一個(gè)腳本文件。但是腳本文件的主人有個(gè)怪癖,對(duì)于一些備注的內(nèi)容希望采用大寫字母來描述。這可能跟某些工程師的閱讀習(xí)慣不一致。為此需要將這些大寫字符轉(zhuǎn)換寫小寫字母。當(dāng)然,系統(tǒng)工程師可以手工的一個(gè)個(gè)進(jìn)行修改。但是,顯然操作起來很麻煩。為此系統(tǒng)工程師就會(huì)想,在Unix操作系統(tǒng)中是否提供了類似的工具,可以將大寫字符轉(zhuǎn)換為小寫字母呢?確實(shí),在Unix操作系統(tǒng)中提供了一個(gè)tr命令。這是一個(gè)強(qiáng)盜的字符轉(zhuǎn)換命令,可以實(shí)現(xiàn)包括字符大小寫轉(zhuǎn)換在內(nèi)地很多功能。
一、tr字符變換命令的基本格式格式要求。
在Unix操作系統(tǒng)中,針對(duì)整行的內(nèi)容或者字段的命令有很多。相比之下,對(duì)一行中的字符進(jìn)行操作的命令卻比較少。這并不是說對(duì)字符操作不重要。而是因?yàn)閠r這個(gè)字符變換命令就可以實(shí)現(xiàn)大部分字符處理的功能。這個(gè)命令的主要功能就是對(duì)字符串進(jìn)行替換。如下圖所示,筆者就是使用tr命令,先將一個(gè)文件中的字母a全部使用字母c來代替。然后第二個(gè)例子就是想文件中的小寫字符全部轉(zhuǎn)換為大寫字符。
這個(gè)命令的基本格式為tr 可選項(xiàng) 參數(shù)1 參數(shù)2 標(biāo)準(zhǔn)輸入
這個(gè)命令的可選項(xiàng)雖然不是很多,但是都比較使用。通常搭配不同的可選項(xiàng),可以實(shí)現(xiàn)不同的功能。另外在這個(gè)命令中,有一個(gè)比較特殊的部分,即標(biāo)準(zhǔn)輸出。這是什么意思呢?而且在這個(gè)命令中沒有文件名這個(gè)參數(shù)。那么如果將一個(gè)文件中的內(nèi)容轉(zhuǎn)換為英文字符呢?原來,這個(gè)命令只接受標(biāo)準(zhǔn)輸入,而不接受文件名作為參數(shù)。為此如果要將某個(gè)文件中的內(nèi)容進(jìn)行大小寫轉(zhuǎn)換時(shí),就需要按照上面的格式,先將文件中的內(nèi)容讀取出來,然后再利用管道符等工具將讀取出來的內(nèi)容傳遞給命令tr。然后再利用這個(gè)tr命令進(jìn)行大小寫轉(zhuǎn)換或者進(jìn)行簡(jiǎn)單的字符替換。在使用標(biāo)準(zhǔn)輸入的時(shí)候,系統(tǒng)工程師即可以將標(biāo)準(zhǔn)輸入放在這個(gè)命令的尾部。也可以使用管道符將標(biāo)準(zhǔn)輸入放在命令的開頭。筆者比較喜歡的是將標(biāo)準(zhǔn)輸入放在命令開頭。這兩個(gè)方式都可以,沒有什么差異。主要是看系統(tǒng)工程師的習(xí)慣而定。
二、實(shí)現(xiàn)大小寫轉(zhuǎn)換。
筆者上面提到的第二個(gè)案例就是將文件text.txt中內(nèi)容進(jìn)行大小寫轉(zhuǎn)換。將文件中所有小寫字符轉(zhuǎn)換成大寫。筆者采用的命令是head –n -2 text.txt | tr ‘[a-z]’ ‘[A-Z]’。由于這個(gè)命令不支持文件名作為其參數(shù),而支持標(biāo)準(zhǔn)輸入。為此筆者就用head命令讀取文件的前面幾行。由于一些腳本文件往往是將這個(gè)腳本的功能說明放置在文件的開頭,所以利用head命令來讀取文本的前面幾行是合理的。如此的話,就可以避免對(duì)整個(gè)腳本文件進(jìn)行轉(zhuǎn)換。要知道shell對(duì)大小寫是敏感的。如果對(duì)一些命令和參數(shù)進(jìn)行了一些不恰當(dāng)?shù)霓D(zhuǎn)換,有可能會(huì)出現(xiàn)莫名其妙的錯(cuò)誤。為此只需要對(duì)腳本文件前面幾行的注釋部分進(jìn)行大小寫轉(zhuǎn)換即可。
另外筆者在這個(gè)命令中用到一些具有特殊意義的元字符,如[]等等。在參數(shù)中如果遇到元字符的話,往往需要采用轉(zhuǎn)義或者引用的機(jī)制,來告訴操作系統(tǒng)將這些字符當(dāng)作普通字符來對(duì)待。一般情況下,系統(tǒng)工程師如果對(duì)他們不需要進(jìn)行變量取值或者命令替換時(shí),必須要使用單引號(hào)等引用或者轉(zhuǎn)移字符。根據(jù)筆者上篇文章談到過的雙引號(hào)與單引號(hào)的相互保護(hù)作用,系統(tǒng)工程師還可以將命令中的表達(dá)式賦值給兩個(gè)變量。然后將變量放置在雙引號(hào)中,求其變量的值。
三、替換某些特定的字符。
在Unix操作系統(tǒng)中有一類比較特殊的文件,即lst文件。這個(gè)文件跟表格文件非常的類似,都是使用分隔符來分隔各個(gè)字段。默認(rèn)情況下,這個(gè)分隔符沒有固定的限制。如可以使用|符號(hào)來進(jìn)行分隔,也可以使用空格符或者TAB鍵來進(jìn)行分隔。也就算說,各位讀者可以根據(jù)自己的需要來設(shè)置分隔符。不過這給文件共享帶來了麻煩。因?yàn)橐粋€(gè)文件按一定的分隔符號(hào)建立完成后,下次閱讀時(shí)就只能夠按照這個(gè)分隔符號(hào)。如果要采用其他的分隔符的話,就需要進(jìn)行手工的調(diào)整。現(xiàn)在假設(shè)一個(gè)項(xiàng)目團(tuán)隊(duì)中的工程師A喜歡采用-分隔符,而另外一個(gè)工程師則喜歡采用|分隔符。那該怎么辦呢?難道需要一個(gè)個(gè)去更換呢?
其實(shí)要實(shí)現(xiàn)這個(gè)轉(zhuǎn)換的方式還是比較多的。如可以使用查找命令配合循環(huán)語句,將這個(gè)文件中的所有-符號(hào)都轉(zhuǎn)換成|符號(hào)。不過利用循環(huán)語句與查找替換命令來實(shí)現(xiàn)這個(gè)功能的話有點(diǎn)復(fù)雜,并一定每個(gè)系統(tǒng)工程師都可以在短時(shí)間內(nèi)寫出這么復(fù)雜的語句。其實(shí)采用這個(gè)tr命令就可以輕松的將這件事情搞定。如利用tr ‘-‘ ‘|’即可。另外如果系統(tǒng)工程師想刪除這個(gè)分隔符,也是可以的。只需要采用一個(gè)可選項(xiàng)-d,就可以將所有的-分隔符去掉。
#p#
另外如果采用-s可選項(xiàng)還可以壓縮多個(gè)連續(xù)的字符。如可以壓縮處理系統(tǒng)命令輸出結(jié)果中的多個(gè)連續(xù)空格等等。如采用-c可選項(xiàng)可用于求表達(dá)式中字符的補(bǔ)集等等。而且最讓人驚奇的是,這幾個(gè)可選項(xiàng)結(jié)合使用,還可以實(shí)現(xiàn)一些比較復(fù)雜的功能。各位讀者回去可以想一下,如果想刪除某幾個(gè)特定字符以外的一些字符,該入如何實(shí)現(xiàn)呢?筆者提醒一下,結(jié)合采用可選賢-c與-d可以實(shí)現(xiàn)這個(gè)需求。大家可以回去測(cè)試一下。
四、使用這個(gè)命令的注意事項(xiàng)。
1、眾所周知,在Unix操作系統(tǒng)中,無論是文件名還是目錄名,又或者是命令,對(duì)于大小寫都是敏感的。這根微軟操作系統(tǒng)有很大的不同。為此在這個(gè)命令中,需要用到兩個(gè)參數(shù)。在這個(gè)參數(shù)中大小寫也是敏感的。如tr a c與tr A c具有不同的含義。第一個(gè)命令是將小寫的英文字符a利用小寫的英文字符c來替換。而第二個(gè)命令表示利用小寫的英文字符c去替換所有大寫的英文字符A。為此筆者提醒各位系統(tǒng)工程師,在使用這個(gè)命令的時(shí)候第一個(gè)主要注意的就是參數(shù)的大小寫一定要一致。否則的話,很難達(dá)到預(yù)計(jì)的效果。
2、兩個(gè)字符串中長(zhǎng)度需要相同。通常情況下采用這個(gè)命令會(huì)將第一個(gè)參數(shù)中的字符變換成第二個(gè)參數(shù)中的相應(yīng)字符。也就是說,利用第二個(gè)參數(shù)中的第一個(gè)字符替換成第一個(gè)參數(shù)中的第一個(gè)字符,依此類推,其他字符也按照這個(gè)規(guī)則進(jìn)行替換。此時(shí),如果兩個(gè)參數(shù)的長(zhǎng)度不相等的話,那么會(huì)出現(xiàn)什么情況呢?如tr abc ab。此時(shí)第一個(gè)參數(shù)表達(dá)式將找不到對(duì)應(yīng)的字符。即系統(tǒng)不知道將字符c利用什么字符來代替。為此在使用這個(gè)命令時(shí),要確保兩個(gè)參數(shù)的長(zhǎng)度必須相等。
3、利用變量提高腳本程序的可用性。有時(shí)候系統(tǒng)工程師可能需要經(jīng)常用到類似的轉(zhuǎn)換功能。如使用這個(gè)命令可以簡(jiǎn)單的實(shí)現(xiàn)一些文件的加密作業(yè)。如可以預(yù)先將英文字符、數(shù)字等等建立一個(gè)一一對(duì)應(yīng)的關(guān)系。然后寫完內(nèi)容之后,可以利用tr命令將文本轉(zhuǎn)換為毫無意義的一個(gè)文件。如果不知道這種對(duì)應(yīng)關(guān)系的話,那么其他用戶即使得到這個(gè)文件也不能夠破譯出到底這個(gè)文本想表示什么內(nèi)容。然后知道這個(gè)對(duì)應(yīng)關(guān)系的用戶,拿到這個(gè)文件后,再次反向執(zhí)行一下這個(gè)命令(即將前后兩個(gè)參數(shù)位置對(duì)調(diào)一下),就可以將文本的內(nèi)容轉(zhuǎn)換成原先的內(nèi)容。如果建立好這個(gè)腳本之后,就可以重復(fù)利用這個(gè)腳不程序來對(duì)一些文件進(jìn)行簡(jiǎn)單的加密。但是要提高其安全性的話,往往需要不斷的對(duì)這個(gè)對(duì)應(yīng)的規(guī)則進(jìn)行調(diào)整。此時(shí)是否需要更改腳本文件呢?其實(shí)不用。因?yàn)檫@個(gè)tr命令支持變量。其實(shí)就是將命令中的兩個(gè)參數(shù)分別賦值給兩個(gè)變量。然后在執(zhí)行命令的時(shí)候讓系統(tǒng)分別對(duì)這兩個(gè)變量求值,得出正確的對(duì)應(yīng)規(guī)則。如此的話,當(dāng)需要更改對(duì)應(yīng)規(guī)則時(shí),不需要改變這個(gè)腳本。只需要修改這兩個(gè)變量的值即可。
【編輯推薦】