如何使用 Linux tr 命令

已發表: 2023-05-17
筆記本電腦上的 Ubuntu Linux 啟動屏幕
Jordan Gloor / How-To Geek
tr 命令對文本流執行轉換,生成一個新流作為其輸出。 您可以根據您在命令行上設置的規則替換、刪除或轉換字符。

您是否需要一種簡潔的方法來在 Linux 中操作文本流? 只需看看 tr 命令,它可以節省您替換、刪除、合併和壓縮輸入文本的時間。 這就是它的完成方式。

目錄

什麼是 tr 命令?
替換字符
使用範圍和標記
反轉火柴
刪除和壓縮字符
刪除字符
合併和分割線
將 tr 與管道一起使用
簡單就是簡單

什麼是 tr 命令?

Linux tr命令是一個快速而簡單的實用程序,用於從文本流中去除不需要的字符,以及其他簡潔的操作技巧。 它的名字來源於“翻譯”一詞,而tr的根源深深植根於 Unix 傳統。

眾所周知,Linux 是 Unix 的開源重寫。 它也將自己的東西添加到組合中。 它不是一個字節對字節的克隆,但它顯然從 Unix 操作系統中汲取了大部分設計原則和工程指導。

儘管迄今為止只有兩個 Linux 發行版(EulerOS 和 Inspur K-UX)被認證為 POSIX 兼容並被正式接受為 Unix 的實現——EulerOS 和 Inspur K-UX——Linux 在商業世界中幾乎完全取代了 Unix。

所有 Linux 發行版,至少在它們的核心實用程序中,都遵循 Unix 哲學。 Unix 哲學概括了 Unix 先驅們對其新操作系統的願景。 它通常被解釋為“編寫能做好一件事的程序”。 但不僅如此。

最強大的創新之一是程序應該生成可用作其他程序輸入的輸出。 將命令行實用程序菊花鏈在一起的能力非常強大,使用一個程序的輸出流作為輸入流到下一個程序。

有時您會希望在一個程序的輸出到達下一個程序之前對其進行微調或微調。 或者,也許您沒有從 Linux 命令行工具獲取輸入,而是從一個文件中流式傳輸文本,而這個文件並不是根據您的特定需求創建的。

這就是tr發揮作用的地方。 它允許您對其輸入流執行一組簡單的轉換,以生成其輸出流。 該輸出流可以重定向到一個文件中,輸入到另一個 Linux 程序中,甚至輸入到tr的另一個實例中,以便對流應用多個轉換。

替換字符

tr命令根據規則對其輸入流進行操作。 在沒有任何命令行選項的情況下使用, tr的默認操作是用輸入流中的字符替換其他字符。

tr命令通常需要兩組字符。 第一組包含在輸入流中找到時將被替換的字符。 第二組包含將被替換的字符。

其工作方式是第一組中出現的第一個字符將被第二組中的第一個字符替換。 第一組中出現的第二個字符將被第二組中的第二個字符替換,依此類推。

此示例將在tr的輸入流中查找字母“c”,並將每個匹配項替換為字母“z”。 請注意, tr區分大小寫。

我們正在使用echo將一些文本推送到tr中。

 迴聲 abcdefabc | tr 'c' 'z' 

用 tr 替換單個字符

所有出現的“c”都被替換為“z”,新字符串被寫入終端窗口。

這次我們將搜索兩個字母“a”和“c”。 請注意,我們不是在搜索“ac”。 我們正在尋找“a”,然後尋找“c”。 我們將用“x”替換所有出現的“a”,用“z”替換所有出現的“c”。

 迴聲 abcdefabc | tr '交流' 'xz' 

用 tr 刪除兩個字母

為此,您必須在兩組中使用相同數量的字符。 如果不這樣做,您將獲得可預測但可能不想要的行為。

 echo '叫我以實瑪利。' | tr 'abcdjklm' '123' 

在 tr 中使用不平衡的字符集

第一組中的字符比第二組中的字符多。 字母“d”到“m”在第二組中沒有對應的字符。 他們仍然會被替換,但他們都被第二組中的最後一個角色替換了。

這在某些情況下可能很有用,但如果您想防止這種情況發生,您可以使用-t (截斷)選項。 這只會替換包含在第一組中且在第二組中具有匹配字符的那些字符。

 echo '叫我以實瑪利。' | tr -t 'abcdjklm' '123' 

使用帶有截斷選項的 tr 的不平衡字符集

使用範圍和標記

設置一和設置二可以包含字符範圍。 例如, [az]代表所有小寫字母, [AZ]代表所有大寫字母。 我們可以利用它來改變文本流的大小寫。

這會將輸入流轉換為大寫。

 echo “How-To Geek” | tr '[az]' '[AZ]' 

使用字符範圍將字符串轉換為大寫

要在另一個方向翻轉大小寫,我們可以使用相同的命令,但在命令行上交換大寫和小寫範圍。

 echo “How-To Geek” | tr '[AZ]' '[az]' 

使用字符範圍將字符串轉換為小寫

對於我們可能想要匹配的一些常見情況,我們可以使用一些標記。

  • [:alnum:] :字母和數字。
  • [:alpha:] :僅限字母。
  • [:digit:] :僅限數字。
  • [:blank:] :製表符和空格。
  • [:space:] :所有空格,包括換行符。
  • [:graph:] :所有字符包括符號,但不包括空格。
  • [:print:] :所有字符包括符號,包括空格。
  • [:punct:] :所有標點符號。
  • [:lower:] :小寫字母。
  • [:upper:] :大寫字母。

我們可以使用標記輕鬆地執行小寫到大寫和大寫到小寫的轉換。

 echo “How-To Geek” | tr '[:lower:]' '[:upper:]'
 echo “How-To Geek” | tr '[:upper:]' '[:lower:]' 

使用標記更改文本字符串的大小寫

反轉火柴

-c (補碼)選項匹配除第一組字符之外的所有字符。 此命令將除字母“c”之外的所有內容轉換為連字符“ - ”。

 迴聲 abcdefc | tr -c 'c' '-' 

用其他字符替換除指定字符以外的所有字符

此命令將字母“a”添加到第一組。 除“a”或“c”之外的任何內容都將轉換為連字符“ - ”字符。

 迴聲 abcdefc | tr -c 'ac' '-' 

用其他字符替換除指定的多個字符以外的所有字符

刪除和壓縮字符

我們可以使用tr完全刪除字符,而不進行任何替換。

此命令使用-d (刪除)選項從輸入流中刪除任何出現的“a”、“d”或“f”。

 迴聲 abcdefc | tr -d 'adf' 

使用 tr 從文本字符串中刪除多個字符

這是一個例子,我們在命令行上只有一組字符,而不是兩組。

另一個是當我們使用-s (擠壓重複)選項時。 此選項將重複字符減少為單個字符。

此示例將空格字符的重複序列減少為單個空格。

 echo "abc de fc" | tr -s '[:空白:]' 

使用 tr 將重複的字符序列更改為字符的單次出現

[:blank:]標記代表空格字符,而[:space:]標記代表所有形式的空白,包括製表符和換行符,這有點令人困惑。

在這種情況下,我們可以用[:blank:]替換[:space:]並得到相同的結果。

 echo "abc de fc" | tr -s '[:空格:]' 

使用 tr 將重複的字符序列更改為字符的單次出現

刪除字符

[:blank:][:space:]之間的區別在我們刪除字符時變得很明顯。 為此,我們使用-d (刪除)選項,並提供tr將在其輸入流中查找的一組字符。 它找到的任何內容都將被刪除。

 echo "abc de fc" | tr -d '[:空白:]' 

使用 tr 從文本字符串中刪除空格(空格字符)

空格被刪除。 請注意,在終端窗口中寫入輸出流後,我們會得到一個換行符。 如果我們重複該命令並使用[:space:]而不是空白,我們將得到不同的結果。

 echo "abc de fc" | tr -d '[:空白:]' 

使用 tr 從文本字符串中刪除空格

這一次我們沒有在輸出後開始新的一行,命令提示符正好對著它。 這是因為[:space:]包含換行符。 從輸入流中刪除所有空格、製表符和換行符。

當然,您也可以使用實際的空格字符。

 echo "abc de fc" | tr -d ' ' 

通過指定空格字符,使用 tr 從文本字符串中刪除空格

我們可以很容易地刪除數字。

 迴聲 abcd123efg | tr -d '[:數字:]' 

使用 tr 從文本字符串中刪除數字

通過組合-c (補碼)和-d (刪除)選項,我們可以刪除除數字以外的所有內容。

 迴聲 abcd123efg | tr -cd '[:數字:]' 

使用 tr 從文本字符串中刪除除數字以外的所有內容

請注意,除數字外的所有內容均表示所有字母所有空格,因此我們再次丟失了終止換行符。

合併和分割線

如果我們用換行符代替空格,我們可以拆分一行文本並將每個單詞放在自己的行上。

 echo '一二三四' | tr ' ' '\n' 

將一行文本拆分為每行一個單詞,使用 tr

我們也可以更改分隔單詞的分隔符。 此命令用冒號“ : ”代替空格。

 echo '一二三四' | tr ' ' ':' 

使用 tr 將單詞定界符從空格更改為冒號

我們可以找到正在使用的任何定界符,並將其替換為換行符,將難以閱讀的文本拆分為更易於管理的輸出。

路徑環境變量是一長串很多目錄路徑。 冒號“ : ”分隔每個路徑。 我們會將它們更改為換行符。

 回顯 $PATH
 迴聲 $PATH | tr ":" "\n" 

將 $PATH 環境變量拆分為單獨的目錄路徑,每行一個,使用 tr

這在視覺上更容易解析。

如果我們有想要重新格式化為單行的輸出,我們也可以這樣做。 文件“lines.txt”包含一些文本,每行一個詞。 我們會將其輸入tr並將其轉換為單行。

 貓文件.txt
 貓行.txt | tr '\n' ' ' 

使用 tr 將多行輸入合併為一行文本

將 tr 與管道一起使用

我們可以使用tr的輸出作為另一個程序的輸入,甚至是tr本身的輸入。

此命令使用tr四次。

  • 第一個tr從輸入中刪除任何連字符“-”。
  • 第二個tr將任何重複的空格壓縮成單個空格。
  • 第三個tr用下劃線“_”字符替換空格。
  • 第四個也是最後一個tr將字符串轉換為小寫。
 echo "損壞的文件-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:upper:]' '[:lower:]' 

四個 tr 實例的管道

相關:如何在 Linux 上使用管道

簡單就是簡單

tr命令很棒,因為它很簡單。 沒有太多要學習或記住的。 但它的簡單性也可能是它的垮台。

別搞錯了,您經常會發現tr讓您可以做您需要做的事,而無需使用更複雜的工具,如sed

如何在 Linux 上使用 sed 命令
相關如何在 Linux 上使用 sed 命令

但是,如果您正在努力使用tr做某事,並且您發現自己在構建長菊花鏈命令,那麼您可能應該使用sed