linux tr命令詳解

經過使用tr,您能夠很是容易地實現 sed 的許多最基本功能。您能夠將 tr 看做爲 sed的(極其)簡化的變體:它能夠用一個字符來替換另外一個字符,或者能夠徹底除去一些字符。您也能夠用它來除去重複字符。這就是全部 tr所可以作的。 git


   tr用來從標準輸入中經過替換或刪除操做進行字符轉換。tr主要用於刪除文件中控制字符或進行字符轉換。使用tr時要轉換兩個字符串:字符串1用於查詢,字符串2用於處理各類轉換。tr剛執行時,字符串1中的字符被映射到字符串2中的字符,而後轉換操做開始。
    帶有最經常使用選項的tr命令格式爲:
tr -c -d -s ["string1_to_translate_from"]["string2_to_translate_to"] < input-file
這裏:
-c 用字符串1中字符集的補集替換此字符集,要求字符集爲ASCII。
-d 刪除字符串1中全部輸入字符。
-s 刪除全部重複出現字符序列,只保留第一個;即將重複出現字符串壓縮爲一個字符串。
input-file是轉換文件名。雖然可使用其餘格式輸入,但這種格式最經常使用。數組

二、字符範圍
指定字符串1或字符串2的內容時,只能使用單字符或字符串範圍或列表。
[a-z] a-z內的字符組成的字符串。
[A-Z] A-Z內的字符組成的字符串。
[0-9] 數字串。
\octal 一個三位的八進制數,對應有效的ASCII字符。
[O*n] 表示字符O重複出現指定次數n。所以[O*2]匹配OO的字符串。
tr中特定控制字符的不一樣表達方式
速記符含義八進制方式
\a Ctrl-G  鈴聲\007
\b Ctrl-H  退格符\010
\f Ctrl-L  走行換頁\014
\n Ctrl-J  新行\012
\r Ctrl-M  回車\015
\t Ctrl-I  tab鍵\011
\v Ctrl-X  \030app

實例:工具

、將文件file中出現的"abc"替換爲"xyz"oop

 
# cat file | tr "abc" "xyz" > new_file
 
【注意】這裏,凡是在file中出現的"a"字母,都替換成"x"字母,"b"字母替換爲"y"字母,"c"字母替換爲"z"字母。而不是將字符串"abc"替換爲字符串"xyz"。
 
二、使用tr命令「統一」字母大小寫
(小寫 --> 大寫)
# cat file | tr [a-z] [A-Z] > new_file
(大寫 --> 小寫)
# cat file | tr [A-Z] [a-z] > new_file
 
三、把文件中的數字0-9替換爲a-j
 
# cat file | tr [0-9] [a-j] > new_file

四、刪除文件file中出現的"Snail"字符
 
# cat file | tr -d "Snail" > new_file
 
【注意】這裏,凡是在file文件中出現的'S','n','a','i','l'字符都會被刪除!而不是牢牢刪除出現的"Snail」字符串。
 
五、刪除文件file中出現的換行'\n'、製表'\t'字符
 
# cat file | tr -d "\n\t" > new_file
 
不可見字符都得用轉義字符來表示的,這個都是統一的。
 
六、刪除「連續着的」重複字母,只保留第一個
 
# cat file | tr -s [a-zA-Z] > new_file
 
七、刪除空行
 
# cat file | tr -s "\n" > new_file
 
八、刪除Windows文件「形成」的'^M'字符
 
# cat file | tr -d "\r" > new_file
或者
# cat file | tr -s "\r" "\n" > new_file
 
【注意】這裏-s後面是兩個參數"\r"和"\n",用後者替換前者
 
九、用空格符\040替換製表符\011
 
# cat file | tr -s "\011" "\040" >new_file
 
十、把路徑變量中的冒號":",替換成換行符"\n"
 

# echo $PATH | tr -s ":" "\n"編碼

----------------------------------------------------------------------------------------------------------------------------------------------------------------spa

 

 

1關於tr 
   經過使用 tr,您能夠很是容易地實現 sed 的許多最基本功能您能夠將 tr 看做爲 sed 的(極其)簡化的變體:它能夠用一個字符來替換另外一個字符,或者能夠徹底除去一些字符您也能夠用它來除去重複字符這就是全部 tr 所可以作的 
       tr用來從標準輸入中經過替換或刪除操做進行字符轉換tr主要用於刪除文件中控制字符或進行字符轉換使用tr時要轉換兩個字符串:字符串1用於查詢,字符串2用於處理各類轉換tr剛執行時,字符串1中的字符被映射到字符串2中的字符,而後轉換操做開始 
帶有最經常使用選項的tr命令格式爲: 
tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file 
這裏: 
-c 用字符串1中字符集的補集替換此字符集,要求字符集爲ASCII 
-d 刪除字符串1中全部輸入字符 
-s 刪除全部重複出現字符序列,只保留第一個;即將重複出現字符串壓縮爲一個字符串 
input-file是轉換文件名雖然可使用其餘格式輸入,但這種格式最經常使用 
2字符範圍 
指定字符串1或字符串2的內容時,只能使用單字符或字符串範圍或列表 
[a-z] a-z內的字符組成的字符串 
[A-Z] A-Z內的字符組成的字符串 
[0-9] 數字串 
\octal 一個三位的八進制數,對應有效的ASCII字符 
[O*n] 表示字符O重複出現指定次數n所以[O*2]匹配OO的字符串 
tr中特定控制字符的不一樣表達方式 
速記符含義八進制方式 
\a Ctrl-G  鈴聲\007 
\b Ctrl-H  退格符\010 
\f Ctrl-L  走行換頁\014 
\n Ctrl-J  新行\012 
\r Ctrl-M  回車\015 
\t Ctrl-I  tab鍵\011 
\v Ctrl-X  \030 
3應用例子 
(1)去除oops.txt裏面的重複的小寫字符 
tr -s "[a-z]"<oops.txt >result.txt 
(2)刪除空行 
tr -s "[\012]" < plan.txt 或 tr -s ["\n"] < plan.txt 
(3)有時須要刪除文件中的^M,並代之以換行 
tr -s "[\015]" "[\n]" < file 或 tr -s "[\r]" "[\n]" < file 
(4)大寫到小寫 
cat a.txt |tr "[a-z]" "[A-Z]" >b.txt 
(5)刪除指定字符 
    一個星期的日程表任務是從其中刪除全部數字,只保留日期日期有大寫,也有小寫格式所以需指定兩個字符範圍[a-z]和[A-Z],命令tr -cs "[a-z][A-Z]" "[\012*]" 將文件每行全部不包含在[a-z]或[A-Z](全部希臘字母)的字符串放在字符串1中並轉換爲一新行-s選項代表壓縮全部新行, -c代表保留全部字母不動原文件以下,後跟tr命令: 
tr -cs "[a-z][A-Z]" "[\012*]" <diary.txt 
(6)轉換控制字符 
    tr的第一個功能就是轉換控制字符,特別是從dos向UNIX下載文件時,忘記設置ftp關於回車換行轉換的選項時更是如此cat -v filename 顯示控制字符 
    cat -v stat.txt 
    box aa^^^^^12^M 
    apple bbas^^^^23^M 
    ^Z 
猜測^ ^ ^ ^ ^ ^是tab鍵每一行以Ctrl-M結尾,文件結尾Ctrl-Z,如下是改動方法 
使用-s選項,查看ASCII表^的八進制代碼是136,^M是015,tab鍵是011,^Z是032 ,下面將按步驟完成最終功能 
用tab鍵替換^ ^ ^ ^ ^ ^,命令爲"\136" "[\011*]"將結果重定向到臨時工做文件stat.tmp 
tr -s "[\136]" "[\011*]" <stat.txt >stat.tmp 
用新行替換每行末尾的^M,並用\n去除^Z,輸入要來自於臨時工做文件stat.tmp 
tr -s "[\015][\032]" "\n" <stat.tmp 
要刪除全部的tab鍵,代之以空格,使用命令 
tr -s "[\011]" "[\040*]" <input.file
(7)替換passwd文件中全部冒號,代之以tab鍵,能夠增長可讀性 
tr -s "[:]" "[\011]" < /etc/passwd 或 tr -s "[:]" "[\t]" < /etc/passwd 
(8)使路徑具備可讀性 
    若是用 echo $PATH 或者 echo $LD_LIBRARY_PATH 等相似的命令來顯示路徑信息的話,咱們看到的將會是一大堆用冒號鏈接在一塊兒的路徑, tr命令能夠把這些冒號轉換爲回車,這樣,這些路徑就具備很好的可讀性了 
echo $PATH | tr ":" "\n" 
(9)能夠在vi內使用全部這些命令!只要記住:在tr命令前要加上您但願處理的行範圍和感嘆號 (!),如 1,$!tr -d '\t'(美圓符號表示最後一行) 
(10)另外,當有人給您發送了一個在 Mac OS 或 DOS/Windows 機器上建立的文本文件時,您會發現tr很是有用 
    若是沒有將文件保存爲使用  UNIX 換行符來表示行結束這種格式,則須要將這樣的文件轉換成本機 UNIX 格式,不然一些命令實用程序不會正確地處理這些文件Mac OS  的行尾以回車字符(\r)結束,許多文本處理工具將這樣的文件做爲一行來處理爲了糾正這個問題,能夠用下列技巧: 
Mac -> UNIX:tr "\r" "\n"<macfile > unixfile 
UNIX -> Mac:tr "\n" "\r"<unixfile > macfile 
Microsoft DOS/Windows 約定,文本的每行以回車字符(\r)並後跟換行符(\n)結束爲了糾正這個問題,可使用下列命令: 
DOS -> UNIX:tr -d "\r"<dosfile > unixfile 
UNIX -> DOS:在這種狀況下,須要用awk,由於tr不能插入兩個字符來替換一個字符要使用的 awk 命令爲 awk '{ print $0"\r" }'<unixfile > dosfile 
注:均可以用sed 來完成

=================================================

用途

轉換字符。unix

語法

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

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

描述

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

轉換字符

若是 String1 和 String2 二者都已指定,但 -d 標誌沒有指定,那麼 tr 命令就會從標準輸入中將 String1 中所包含的每個字符都替換成 String2 中相同位置上的字符。

使用 -d 標誌刪除字符

若是 -d 標誌已經指定,那麼 tr 命令就會從標準輸入中刪除 String1 中包含的每個字符。

用 -s 標誌除去序列

若是 -s 標誌已經指定,那麼 tr 命令就會除去包含在 String1 或 String2 中的任何字符串系列中的除第一個字符之外的全部字符。對於包含在 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 發生錯誤。

示例

  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:]' '[#*]'
相關文章
相關標籤/搜索