Unix/Linux 的 tr 指令使用
tr(translate)用來轉換或刪除文字資料中指定字元,是精簡的文字處理工具,特別是不需要完整的 regex 或 awk 功能時。
tr 的語法如下
SYNOPSIS
tr [OPTION]... STRING1 [STRING2]
STRING1 和 STRING2 是兩組字元,如果同時提供,會將屬於 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