trコマンドで 文字ずらし
trとは、標準入力の文字を置換・削除・圧縮するコマンドである。
trコマンドとは/何の略?
tr は translate / transliterate の略で、文字集合(set)を別の集合に変換します。ファイル名は直接受け取らず、標準入力→標準出力で動くのが特徴です。よく cat・パイプ・ヒアストリングと組み合わせます。
主な動作の比較
| 機能 | 使い方 | 典型例 | 要点 |
|---|---|---|---|
| 置換 | tr set1 set2 |
tr 'a-z' 'A-Z' |
set2 が短いと最後の文字が繰り返されて埋められる |
| 削除 | tr -d set1 |
tr -d '[:digit:]' |
set1 に含まれる文字を取り除く |
| 連続圧縮 | tr -s set1 |
tr -s ' ' |
set1 に含まれる連続文字を 1 個に圧縮 |
| 補集合 | tr -c set1 set2 |
tr -c '[:print:]' '\n' |
set1 以外を set2 に変換(例は非表示文字を改行に) |
具体例:ROT13(13 文字ずらし)
英字を 13 文字回す「Caesar/ROT13」は tr のお家芸です。
# ファイル data.txt を ROT13 変換
cat data.txt | tr a-z n-za-m | tr A-Z N-ZA-M
a-z → n-za-m は “n で始めて z の後に a-m を続ける” という意味。大文字は別途同じ変換を掛けます。ヒアストリングなら:
tr a-z n-za-m <<< "hello world" | tr A-Z N-ZA-M
応用:13 以外のずらしも可能。例:ROT5 は
tr 'a-z' 'f-za-e' | tr 'A-Z' 'F-ZA-E'。
実用スニペット
# 小文字化
tr 'A-Z' 'a-z'
# 大文字化
tr 'a-z' 'A-Z'
# 数字を削除
tr -d '[:digit:]'
# 連続スペースを 1 個に
tr -s ' '
# 改行 → スペース(最後に改行が消える点に注意)
tr '\n' ' '
集合(set)の書き方チートシート
| 表記 | 意味 | 例 | 補足 |
|---|---|---|---|
'a-z' |
範囲 |
a..z をすべて含む |
ロケールに依存しない範囲 |
'[:lower:]' |
文字クラス(小文字) | 英小文字全般 | ロケール依存(LC_ALL=Cで固定化) |
'[:upper:]' |
文字クラス(大文字) | 英大文字全般 | 同上 |
'[:digit:]' |
文字クラス(数字) | 0-9 |
同上 |
'[:space:]' |
空白類 | スペース/タブ/改行など | 同上 |
-c |
補集合 | tr -c '[:print:]' |
set1 以外を対象に |
-s |
連続圧縮 | tr -s '[:space:]' |
連なりを 1 個に |
-d |
削除 | tr -d '0-9' |
置換ではなく除去 |
よくある落とし穴
-
UTF-8 の多バイト文字は壊れる:
trは基本バイト単位。日本語のカナ・漢字の変換は対象外。英数記号に限定するか、iconv/nkf/awk/python等を使う。 -
クォート必須:
a-zはシェル展開を避けるため 必ずクォート('a-z')。 -
ロケール影響:
[:upper:]などのクラスはロケール依存。再現性重視ならLC_ALL=C tr ...。 - BSD と GNU の細差:細かな挙動差があるため、移植性が要るスクリプトは POSIX に沿った最小機能(置換/削除/圧縮/補集合)に絞るのが安全。
まとめ
tr は「単純だが速い」文字処理ツール。英字の文字ずらし(ROT 系)、大文字小文字変換、ノイズ削除、空白圧縮のワンライナーを武器に、前処理を軽くして後段(awk/sed/grep)を楽にしましょう。