trコマンドは標準入力の文字を別の文字に変換するコマンドである。-dオプションで指定した文字を削除でき、-sオプションで連続する文字を1文字に圧縮できる。
指定した文字を削除する(tr -d)
tr -dは、指定した文字を標準入力から削除する。
$ echo "hello, world" | tr -d "lo"
he, wrd
上記コマンドは、“hello, world” から l と o を削除し、“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文字に圧縮する。
\第一線のプログラマーの行動原理を学べる!/
