Skip to main content

Unix/Linux 的 tr 指令使用

tr(translate)用來轉換或刪除文字資料中指定字元,是精簡的文字處理工具,特別是不需要完整的 regex 或 awk 功能時。

tr 的語法如下

SYNOPSIS
tr [OPTION]... STRING1 [STRING2]

STRING1STRING2 是兩組字元,如果同時提供,會將屬於 STRING1 的字元轉換為 STRING2 對應位置的字元。若只提供 STRING1 則需搭配 -d-s 使用。

資訊

要注意 tr 是逐字元而不是逐行處理,這和 sed/awk 完全不同,而且無法處理 UTF-8 多位元字元如中文,只能處理 ASCII。

常用參數

  • -d: 刪除屬於 STRING1 的字元
  • -s: 壓縮重複字元,只保留一個
  • -c: 取反 STRING1 的字元集合
  • -t: truncate STRING1 讓他的長度和 STRING2 相同

字元集合

字元集合可以簡化集合定義:

  • [:digit:]: 所有數字(0–9)
  • [:alpha:]: 所有英文字母(a–zA–Z)
  • [:lower:]: 小寫字母
  • [:upper:]: 大寫字母
  • [:space:]: 空白(空格、tab、換行等)

常用範例

tr 幾乎一定要搭配管道使用,因為他不支援檔案輸入,只會讀取 stdin。

轉大寫

echo 'hello world' | tr 'a-z' 'A-Z'
echo 'hello world' | tr '[:lower:]' '[:upper:]' # 效果相同

刪除換行

cat log.txt | tr -d '\n'

壓縮空白

echo 'a    b  c     d' | tr -s ' '

移除數字

echo 'abc123xyz098' | tr -d '0-9'
echo 'abc123xyz098' | tr -d '[:digit:]' # 效果相同

刪除標點與空白

配合 -d[:punct:] [:space:],清除掉標點與空白:

echo 'Hello, world! Welcome.' | tr -d '[:punct:][:space:]'

輸出為:

HelloworldWelcome