trコマンドは標準入力の文字を別の文字に変換するコマンドである。-dオプションで指定した文字を削除でき、-sオプションで連続する文字を1文字に圧縮できる。

指定した文字を削除する(tr -d)

tr -dは、指定した文字を標準入力から削除する。

$ echo "hello, world" | tr -d "lo"
he, wrd

上記コマンドは、“hello, world” から lo を削除し、“he, wrd” を出力する。

[:digit:]のような文字クラスも指定できる。

$ echo "abc123def456" | tr -d "[:digit:]"
abcdef

上記コマンドは、文字列中の数字をすべて削除する。

連続する文字を1文字に圧縮する(tr -s)

tr -sは、連続して並ぶ同じ文字を1文字に圧縮する。-s--squeeze-repeatsの略である。

$ echo "aaabbbccc" | tr -s "a-c"
abc

上記コマンドは、a-cの範囲で連続する文字を1文字にまとめ、“abc” を出力する。

連続する半角スペースを1つにまとめる用途でもよく使われる。

$ echo "a    b     c" | tr -s " "
a b c

連続する空行を1行にまとめたい場合は、改行文字\nを指定する。

$ printf "line1\n\n\n\nline2\n\n\nline3\n" | tr -s "\n"
line1
line2
line3

cutコマンドの前処理として使う

ps auxのように桁揃えのため可変個のスペースを含むコマンド出力がある。そのままcut -d" "で列を抽出しようとすると、空フィールドを挟んでしまい列がずれる。

$ ps aux | head -3
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.6  0.0   5240  3072 ?        Ss   10:55   0:00 bash
root          37  0.0  0.0   6896  4532 ?        R    10:56   0:00 ps aux

tr -s " "で連続するスペースを1つに圧縮してからcutに渡すと、-d" "で区切ったフィールド番号どおりに列を取得できる。

$ ps aux | tr -s " " | cut -d" " -f2,11
PID COMMAND
1 bash
37 ps

-d と -s を組み合わせる

-d-sは同時に指定できる。-dsオプションに続けて、削除対象の文字と圧縮対象の文字を順に指定する。

$ printf "aabbccdd\n" | tr -ds "b" "c"
aacdd

上記コマンドは、bを削除したうえで、連続するcを1文字に圧縮する。