文章目錄
原文連結
# echo "abcd"|tr 'a' 'b' bbcd
tr 命令
用途
轉換字元。
文法
tr [ -c | -cds | -cs | -C | -Cds | -Cs | -ds | -s ] [ -A ] String1 String2
tr { -cd | -cs | -Cd | -Cs | -d | -s } [ -A ] String1
描述
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 位八進位整數。Null 字元可以用 '\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 指定的字串中的每個字元。注:
- 當 -C 選項和 -d 選項一起指定時,將刪除所有除 String1 指定的那些字元以外的字元。忽略 String2 的內容,除非也指定了 -s 選項。
- 當 -c 選項和 -d 選項一起指定時,將刪除所有除 String1 指定的那些字元以外的字元。忽略 String2 的內容,除非也指定了 -s 選項。
|
| -s |
在重複字元序列中除去除第一個字元以外的所有字元。將 String1 所指定的字元序列在轉換之前從標準輸入中除去,並將 String2 所指定的字元序列從標準輸出中除去。 |
| String1 |
指定一個字串。 |
| String2 |
指定一個字串。 |
退出狀態
該命令返回以下出口值:
樣本
- 若要將大括弧轉換為小括弧,請輸入:
tr '{}' '()' < textfile > newfile這便將每個 {(左大括弧)轉換成 ((左小括弧),並將每個 }(右大括弧)轉換成 )(右小括弧)。所有其它的字元都保持不變。
- 若要將大括弧轉換成方括弧,請輸入:
tr '{}' '\[]' < textfile > newfile這便將每個 {(左大括弧)轉換成 [(左方括弧),並將每個 }(右大括弧)轉換成 ](右方括弧)。左方括弧必須與一個 "\"(反斜扛)逸出字元一起輸入。
- 若要將小寫字元轉換成大寫,請輸入:
tr 'a-z' 'A-Z' < textfile > newfile
- 若要建立一個檔案中的單字清單,請輸入:
tr -cs '[:lower:][:upper:]' '[\n*]' < textfile > newfile
這便將每一序列的字元(除大、小寫字母外)都轉換成單個分行符號。*(星號)可以使 tr 命令重複分行符號足夠多次以使第二個字串與第一個字串一樣長。
- 若要從某個檔案中刪除所有Null 字元,請輸入:
tr -d '\0' < textfile > newfile
- 若要用單獨的換行替換每一序列的一個或多個換行,請輸入:
tr -s '\n' < textfile > newfile
或
tr -s '\012' < textfile > newfile
- 若要以“?”(問號)替換每個非列印字元(有效控制字元除外),請輸入:
tr -c '[:print:][:cntrl:]' '[?*]' < textfile > newfile
這便對不同語言環境中建立的檔案進行掃描,以尋找當前語言環境下不能列印的字元。
- 要以單個“#”字元替換 <space> 字元類中的每個字元序列,請輸入:
tr -s '[:space:]' '[#*]'