linux下的tr命令

原址:

http://www.360doc.com/content/10/0926/09/1107705_56449410.shtml(360doc真夠不要臉的,不註冊不能複製)

http://study.chyangwa.com/IT/AIX/aixcmds5/tr.htm#a0939bb(命令參考大全之tr命令)

tr 命令

用途

轉換字符。

語法

tr -c | -cds -cs | -C | -Cds | -Cs | -ds |  -s ][  -A ] String1 String2

tr { -cd -cs | -Cd | -Cs |  -d -s } [  -A ] String1

描述

tr 命令從標準輸入刪除或替換字符,並將結果寫入標準輸出。根據由 String1String2 變量指定的字符串以及指定的標誌,tr 命令可執行三種操作。

轉換字符

如果 String1 String2 兩者都已指定,但 -d 標誌沒有指定,則 tr 命令就會從標準輸入中將 String1 中所包含的每一個字符都替換成 String2 中相同位置上的字符。

使用 -d 標誌刪除字符

如果 -d 標誌已經指定,則 tr 命令就會從標準輸入中刪除 String1 中包含的每一個字符。

用 -s 標誌除去序列

如果 -s 標誌已經指定,則 tr 命令就會除去包含在 String1String2 中的任何字符串系列中的除第一個字符以外的所有字符。對於包含在 String1 中的每一個字符,tr 命令會從標準輸出中除去除第一個出現的字符以外的所有字符。對於包含在 String2 中的每一個字符,tr 命令除去標準輸出的字符序列中除第一個出現的字符以外的所有字符。

表達字符串的特殊序列

String1 String2 變量中所包含的字符串可以使用以下的約定來表示:

C1-C2 指定了 C1 所指定的字符和 C2 所指定的字符之間(包括 C1 和 C2)進行整理的字符串。C1 所指定的字符必須整理放在由 C2 所指定的字符之前。
注:
在使用本方法指定子範圍時,當前語言環境對結果有重要影響。如果需要用命令來產生與語言環境無關的一致結果,則應該避免使用子範圍。
[C*Number] Number 是一個整數,它指定了由 C 所指定的字符的重複次數。除非其首位數字是 0,否則 Number 一律視爲是十進制整數;如果首位數字是 0,則視爲八進制整數。
[C*] C 指定的字符填寫字符串。該選項只用於包含在 String2 中的字符串末尾,它強制 String2 中的字符串具有與由 String1 變量所指定的字符串一樣的字符數。*(星號)後面指定的任何字符都被忽略。
[ :ClassName: ] 指定由當前語言環境中的 ClassName 所命名的字符類中的所有字符。類名可以是下述名稱中的任何一種:
alnum      lower
alpha      print
blank      punct
cntrl      space
digit      upper
graph      xdigit

[:lower:][:upper:] 轉換字符類之外,其它字符類指定的字符都按未指定的順序放入數組中。由於未定義字符類指定的字符的順序,僅當目的爲將多個字符映射爲一個時才使用這些字符。轉換字符類除外。

有關字符類的詳細情況,請參閱 ctype 子例程。

[ =C= ] 指定所有的字符具有與 C 所指定的字符相同的等價類。
\Octal 指定字符,其編碼由 Octal 所指定的八進制值表示。Octal 可以是 1 位、2 位 或 3 位八進制整數。空字符可以用 '\0' 表示,並可以像任何其它的字符那樣進行處理。
\ControlCharacter 指定與 ControlCharacter 所指定的值相應的控制字符。可以表示以下值:
\a
警告
\b
退格鍵
\f
換頁
\n
換行
\r
回車
\t
製表鍵
\v
垂直製表鍵
\\ 規定 "\"(反斜槓)就是作反斜槓使用,而無作爲轉義字符的任何特殊意義。
\[ 指定“[”(左括號)就作爲左括號使用,而無作爲特定字符串序列的開始字符的任何特殊意義。
\- 指定“-”(負號)就作爲負號使用,而無作爲範圍分隔符的任何特殊意義。

如果某個字符在 String1 中被指定過多次,則該字符就被轉換成 String2 中爲與 String1 中最後出現的字符相對應的字符。

如果由 String1 String2 指定的字符串長度不相同,則 tr 命令就會忽略較長一個字符串中的多餘字符。

標誌

-A 使用範圍和字符類 ASCII 整理順序、一個字節一個字節地執行所有操作,而不是使用當前語言環境整理順序。
-C 指定 String1 值用 String1 所指定的字符串的補碼替換。String1 的補碼是當前語言環境的字符集中的所有字符,除了String1 指定的字符以外。如果指定了 -A -c 標誌都已指定,則與所有 8 位字符代碼集合有關的字符將被補足。如果指定了 -c -s 標誌,則 -s 標誌適用於 String1 的補碼中的字符。

如果沒有指定 -d 選項,則由 String1 指定的字符的補碼將放置到升序排列的數組中(如 LC_COLLATE 的當前設置所定義)。

-c 指定 String1 值用 String1 所指定的字符串的補碼替換。String1 的補碼是當前語言環境的字符集中的所有字符,除了String1 指定的字符以外。如果指定了 -A -c 標誌都已指定,則與所有 8 位字符代碼集合有關的字符將被補足。如果指定了 -c -s 標誌,則 -s 標誌適用於 String1 的補碼中的字符。

如果沒有指定 -d 選項,則由 String1 指定的值的補碼將放置到通過二進制值升序排列的數組中。

-d 從標準輸入刪除包含在由 String1 指定的字符串中的每個字符。
注:
  1. -C 選項和 -d 選項一起指定時,將刪除所有除 String1 指定的那些字符以外的字符。忽略 String2 的內容,除非也指定了 -s 選項。
  2. -c 選項和 -d 選項一起指定時,將刪除所有除 String1 指定的那些字符以外的字符。忽略 String2 的內容,除非也指定了 -s 選項。
-s 在重複字符序列中除去除第一個字符以外的所有字符。將 String1 所指定的字符序列在轉換之前從標準輸入中除去,並將 String2 所指定的字符序列從標準輸出中除去。
String1 指定一個字符串。
String2 指定一個字符串。

退出狀態

該命令返回以下出口值:

0 所有輸入處理成功。
>0 產生錯誤。

示例

  1. 若要將大括號轉換爲小括號,請輸入:
    tr '{}' '()' < textfile > newfile

    這便將每個 {(左大括號)轉換成 ((左小括號),並將每個 }(右大括號)轉換成 )(右小括號)。所有其它的字符都保持不變。

  2. 若要將大括號轉換成方括號,請輸入:
    tr '{}' '\[]' < textfile > newfile

    這便將每個 {(左大括號)轉換成 [(左方括號),並將每個 }(右大括號)轉換成 ](右方括號)。左方括號必須與一個 "\"(反斜扛)轉義字符一起輸入。

  3. 若要將小寫字符轉換成大寫,請輸入:
    tr 'a-z' 'A-Z' < textfile > newfile
  4. 若要創建一個文件中的單詞列表,請輸入:
    tr -cs '[:lower:][:upper:]' '[\n*]' < textfile > newfile

    這便將每一序列的字符(除大、小寫字母外)都轉換成單個換行符。*(星號)可以使 tr 命令重複換行符足夠多次以使第二個字符串與第一個字符串一樣長。

  5. 若要從某個文件中刪除所有空字符,請輸入:
    tr -d '\0' < textfile > newfile
  6. 若要用單獨的換行替換每一序列的一個或多個換行,請輸入:
    tr -s '\n' < textfile > newfile

    tr -s '\012' < textfile > newfile
  7. 若要以“?”(問號)替換每個非打印字符(有效控制字符除外),請輸入:
    tr -c '[:print:][:cntrl:]' '[?*]' < textfile > newfile

    這便對不同語言環境中創建的文件進行掃描,以查找當前語言環境下不能打印的字符。

  8. 要以單個“#”字符替換 <space> 字符類中的每個字符序列,請輸入:
    tr -s '[:space:]' '[#*]'

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就可以了。


發佈了15 篇原創文章 · 獲贊 3 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章