首頁 > 軟體

Linux tr 命令詳解

2020-06-16 16:33:42

tr 是 Linux 和 Unix 系統中的命令列實用程式,用於轉換,刪除和擠壓標準輸入中的字元,並將結果寫入標準輸出。

該 tr 命令通常通過管道與其他命令結合使用,可以執行刪除重複字元,將大寫轉換為小寫,以及替換和刪除基本字元等操作。

在本教學中,我們將向您展示如何 tr 通過實際範例和最常見選項的詳細說明來使用該命令。

如何使用 Tr 命令

該 tr 命令的語法如下:

tr OPTION... SET1 [SET2]

tr  接受兩組字元,通常具有相同的長度,並用第二組中的相應字元替換第一組的字元。

一個 SET 就是一串字元,包括特殊的反斜槓跳脫字元。

在下面的範例中, tr 將 linuxidc 通過將第一個集合中的字元與第二個集合中的匹配元素進行對映來替換標準輸入中的所有字元。

linuxidc@linuxidc:~/www.linuxidc.com$ echo 'linuxidc' | tr 'lin' 'red'

tr 將使用 r 替換 l ,使用 e 替換 i 和 d 替換 n 。

reduxedc

還可以使用字元範圍定義字元集。例如:

linuxidc@linuxidc:~/www.linuxidc.com$ echo 'linuxidc' | tr 'lmno' 'wxyz'
wiyuxidc

您可以使用:

linuxidc@linuxidc:~/www.linuxidc.com$ echo 'linuxidc' | tr 'l-n' 'w-z'
wiyuxidc

當使用 -c(--complement) 選項時, tr 將替換不在 SET1 中的所有字元。

在下面的範例中, SET1 中不包含的所有字元將替換為 SET2 中的最後一個字元:

echo 'linuxidc' | tr -c 'li' 'xy'
liyyyiyyy

您可能已經注意到輸出比輸入多了一個字元。這是因為該 echo 命令列印了一個不可見換行符 n 也被替換為 y 。要在沒有新行的情況下回顯字串,請使用該 -n 選項。

-d(--delete) 選項告訴 tr 以刪除 SET1 指定的字元。

以下命令將刪除 SET1 中指定的所有字元。在不擠壓的情況下刪除字元時,只能指定一個字元集。

linuxidc@linuxidc:~/www.linuxidc.com$ echo 'Linuxidc' | tr -d 'lid'

L 不會刪除該字元,因為輸入包含的是大寫的 L ,而集合中的字元包含小寫的 l 。

Lnuxc

在 -s(--squeeze-repeats) 選項替換重複出現的字元集。在以下範例 tr 中將刪除重複的空格字元:

linuxidc@linuxidc:~/www.linuxidc.com$ echo "GNU        Linux" | tr -s ' '
GNU Linux

使用 SET2 時, SET1 中指定的字元序列將替換為 SET2 。

linuxidc@linuxidc:~/www.linuxidc.com$ echo "GNU        Linux" | tr -s ' ' '_'
GNU__Linux

-t(--truncate-set1) 選項強制 tr 到做進一步處理之前截斷 SET1 到 SET2 的長度。

預設情況下,如果 SET1 大於 SET2   tr 將重用 SET2  的最後一個字元。這是一個例子:

linuxidc@linuxidc:~/www.linuxidc.com$ echo 'Linux idc' | tr 'abcde' '12'

輸出將顯示 SET1 中的字元 e 與 SET2 的最後字元匹配,即 2 :

Linux i22

現在使用帶有 -t 選項的相同命令:

linuxidc@linuxidc:~/www.linuxidc.com$ echo 'Linux idc' | tr -t 'abcde' '12'

您可以看到,在這種情況下, SET1 的最後三個字元將被刪除。 SET1 變為 ‘ab’ ,與 SET2 的長度相同。

Linux idc

組合選項

該 tr 命令還允許您組合使用選項。例如,下面的命令將替換所有字元除了 i 用 0 ,然後它會擠壓重複 0 字元:

echo 'Linux idc' | tr -cs 'i' '0'
0i0i0

Tr 命令範例

在本節中,我們將介紹 tr 命令常見用法的幾個範例。

將小寫轉換為大寫

將小寫轉換為大寫或大寫轉為小寫是 tr 命令的典型用例之一。 [:lower:] 匹配所有小寫字元, [:upper:] 匹配所有大寫字元。

echo 'Linuxidc' | tr '[:lower:]' '[:upper:]'
LINUXidc

您也可以使用範圍代替字元類:

echo 'Linuxidc' | tr 'a-z' 'A-Z'

要將大寫字母轉換為小寫字母,只需切換集合的位置即可。

刪除所有非數位字元

以下範例將從傳遞給 tr 命令的輸入中刪除所有非數位字元:

echo "my phone is 123-456-7890" | tr -cd [:digit:]

[:digit:] 代表所有數位字元,通過使用該 -c 選項,該命令將刪除所有非數位字元。輸出將如下所示:

1234567890

將每個單詞放在新行中

要將每個單詞放在一個新行中,我們需要匹配所有非 alpha 數位字元並用新行替換它們:

linuxidc@linuxidc:~/www.linuxidc.com$ echo 'GNU is an operating system' | tr -cs '[:alnum:]' 'n'
GNU
is
an
operating
system

刪除空行

要刪除空白行,只需擠壓重複的換行符:

tr -s 'n' < file.txt > new_file.txt

在上面的命令中,我們使用重定向符號將命令 < 的內容作為輸入傳遞 file.txt 給 tr 命令。重定向 > 將命令的輸出寫入 new_file.txt 。

在單獨的行上列印 $PATH 目錄

該 $PATH 環境變數是一個冒號分隔的列表,告訴 SHELL 當你輸入一個命令時可以在哪些目錄來搜尋可執行檔案。

要在單獨的行上列印每個目錄,我們需要匹配冒號 (:) 並將其替換為新行:

linuxidc@linuxidc:~/www.linuxidc.com$ echo $PATH | tr  ':' 'n'
/home/linuxidc/.cargo/bin
/home/linuxidc/.local/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
/opt/nodejs/bin

到目前為止,您應該很好地理解如何使用 Linux   tr 命令。雖然非常有用, tr 但只能使用單個字元。對於更複雜的模式匹配和字串操作,您應該使用 sed 或 awk 。


IT145.com E-mail:sddin#qq.com