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