用 tr 過濾檔案

zhuachen發表於2011-10-18

用 tr 過濾檔案

沒有人曾說過 sed 很容易 — 它確實不容易!
但透過使用 tr,您可以非常容易地實現sed 的許多最基本功能。Jacek Artymiak 向您展示如何去做。
您可以將 tr 看作為 sed 的(極其)簡化的變體:它可以用一個字元來替換另一個字元,或者可以完全除去一些字元。您也可以用它來除去重複字元。這就是所有 tr 所能夠做的。
那麼,為什麼要使用 tr,而不使用 sed 呢?當然是為了使事情簡單。例如,如果我們希望用字母“z”來替換出現的所有字母“a”,則可以用 tr a z ,這條命令毫無疑問比 sed -e s/a/z/g 簡單,尤其在把它用到指令碼中時,其中的引號轉義很讓人頭痛。另外,在使用 tr 時,可以避免寫那些讓人討厭的正規表示式。
使用 tr 很簡單:使用前面一段中所給出的符號表示法,用一個字元去替換出現的所有另一個字元。當需要替換多個字元時,使用類似於這樣的表示法: tr abc xyz ,它表示用字母“x”去替換出現的所有字母“a”,用字母“y”去替換所有字母“b”,用字母“z”去替換所有字母“c”。這兩組中所列出的字元的數目不必相等。
您也可以指定字元的範圍。例如, tr a-z A-Z 將用對應的大寫字母來替換所有的小寫字母(例如,它將“no smoking”轉換成“NO SMOKING”)。當您在 vi 編輯器中想強調正在編輯的文字的某一部分時,使用這一特殊技巧非常方便。只要按一下 Escape 鍵,然後按 : 鍵,再輸入 2,4!tr 'a-z' 'A-Z' ,最後按一下 Return 鍵。現在,從第 2 行到第 4 行的字母就都轉換成了大寫字母。
另外,當有人給您傳送了一個在 Mac OS 或 DOS/Windows 機器上建立的文字檔案時,您會發現 tr 非常有用。如果沒有將檔案儲存為使用 UNIX 換行符來表示行結束這種格式,則需要將這樣的檔案轉換成本機 UNIX 格式,否則一些命令實用程式不會正確地處理這些檔案。Mac OS 的行尾以回車字元結束,許多文字處理工具將這樣的檔案作為一行來處理。為了糾正這個問題,可以用下列技巧:

•Mac -> UNIX: tr 'r' 'n' unixfile

•UNIX -> Mac: tr 'n' 'r' macfile

Microsoft DOS/Windows 約定,文字的每行以回車字元並後跟換行符結束。為了糾正這個問題,可以使用下列命令:

•DOS -> UNIX: tr -d 'r' unixfile

•UNIX -> DOS:在這種情況下,需要用 awk ,因為 tr 不能插入兩個字元來替換一個字元。要使用的 awk 命令為 awk '{ print $0"r" }' dosfile

另外,當您需要對文字檔案做一些簡單的整理工作(如用 tr -d 't' 除去製表符,用 tr -s ' ' 除去多餘的空格,或者用 tr -d 'n' 將分開的幾行合成一行)時,會需要用 tr。同樣,可以在 vi 內使用所有這些命令;只要記住:在 tr 命令前要加上您希望處理的行範圍和感嘆號(!),如 1,$!tr -d 't' (美元符號表示最後一行)中所示。

( 轉自IBM developerWorks 中國 )[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23682146/viewspace-1055757/,如需轉載,請註明出處,否則將追究法律責任。

相關文章