tr コマンドは、標準入力から受け取った文字を 変換・削除 して標準出力に返すコマンドです。
実務では、アルファベットの大文字・小文字変換や、不要な文字の削除、改行の置換などに利用されます。
構文(Syntax)
tr [オプション] SET1 [SET2]
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
| (なし) | SET1 を SET2 に変換 | `echo “abc” |
-d | 指定した文字を削除 | echo "hello123" | tr -d 0-9 |
-s | 連続する同じ文字を1つに圧縮 | echo "aaabbb" | tr -s ab |
-c | SET1 の補集合を対象にする(NOT演算) | echo "abc123" | tr -cd 0-9 |
実行例
小文字を大文字に変換
echo "hello world" | tr a-z A-Z
出力例:
HELLO WORLD
大文字を小文字に変換
echo "HELLO" | tr A-Z a-z
出力例:
hello
数字を削除
echo "user123" | tr -d 0-9
出力例:
user
改行をスペースに変換
echo -e "a\nb\nc" | tr '\n' ' '
出力例:
a b c
連続するスペースを1つに圧縮
echo "a b c" | tr -s ' '
出力例:
a b c
数字以外を削除(補集合)
echo "abc123xyz" | tr -cd 0-9
出力例:
123
エラー例(SET2 を省略)
echo "abc" | tr abc
出力例:
tr: missing operand after 'abc'
Try 'tr --help' for more information.
POSIX文字クラスを使った変換
tr は a-z のような範囲指定のほか、POSIX文字クラス([:alpha:] など)を使って文字種をまとめて指定できます。多言語環境やロケール差異の影響を受けにくく、実務では範囲指定より安全なケースが多いです。
| 文字クラス | 意味 | 使用例 |
|---|---|---|
[:alpha:] | 英字(大文字・小文字) | tr -cd '[:alpha:]' |
[:digit:] | 数字 | tr -cd '[:digit:]' |
[:space:] | 空白文字(スペース・タブ・改行など) | tr -d '[:space:]' |
[:punct:] | 記号・句読点 | tr -d '[:punct:]' |
[:upper:] / [:lower:] | 大文字 / 小文字 | tr '[:lower:]' '[:upper:]' |
[:cntrl:] | 制御文字(改行・タブ以外の不可視文字) | tr -d '[:cntrl:]' |
# 英数字以外をすべて削除
echo "Hello, World! 123" | tr -cd '[:alnum:]'
# → HelloWorld123
# 大文字・小文字を文字クラスで変換(a-z A-Z の範囲指定より安全)
echo "Hello" | tr '[:lower:]' '[:upper:]'
# → HELLO
実務でよく使う一行コマンド集
Windows改行(CRLF)をUnix改行(LF)に変換
tr -d '\r' < win.txt > unix.txt
\r(CR)だけを削除することでLF改行に統一できます。同等の処理は dos2unix でも可能ですが、tr なら追加インストール不要です。
前後の空白をまとめてトリムする
echo " hello world " | tr -s '[:space:]' ' ' | sed 's/^ //; s/ $//'
# → hello world
tr -s は連続する空白の圧縮はできますが、文字列の先頭・末尾の削除(トリム)はできないため、sed と組み合わせるのが実務的です。
ROT13で簡易的に文字列を変換する
echo "Hello" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
# → Uryyb
tr と sed の使い分け
どちらも文字列を変換できますが、得意分野が異なります。1文字対1文字の変換・削除は tr、パターンマッチや行単位の複雑な置換は sed が向いています。
| 用途 | tr | sed |
|---|---|---|
| 1文字単位の変換・削除 | ◎(高速・シンプル) | △(記述が冗長) |
| 複数文字列(単語)の置換 | ×(非対応) | ◎(s/foo/bar/) |
| 正規表現マッチ | × | ◎ |
| 行の削除・抽出 | × | ◎ |
| 日本語などマルチバイト文字 | △(非対応が多い) | ○ |
単語単位の置換や正規表現が必要な場合は、sed や awk の利用を検討してください。
よくある質問(FAQ)
Q. trで日本語(マルチバイト文字)を扱えないのはなぜ?
A. tr は基本的に1バイト=1文字として処理するため、UTF-8の日本語のような複数バイト文字は正しく扱えないことがあります。日本語を含む変換には sed や awk、または iconv(文字コード変換)を使ってください。
Q. 複数文字を1文字にまとめて置換したい
A. tr は1文字対1文字の変換専用のため、”abc”を”X”のようにまとめる変換はできません。sed 's/abc/X/g' を使ってください。
Q. SET1とSET2の文字数が異なる場合はどうなる?
A. SET2がSET1より短い場合、SET2の最後の文字が繰り返し使われます(GNU tr の場合)。文字数を揃えるか、意図した挙動か確認してから使うのが安全です。
関連コマンド
備考
trは 標準入力から標準出力へ の変換専用。直接ファイル指定はできない(リダイレクトで対応)。- マルチバイト文字(日本語など)には非対応のことが多い。基本的に ASCII 文字に利用。
- 文字範囲は
a-z,A-Z,0-9などで指定可能。
参考
- manページ: man7.org tr(1)
- GNU Coreutils: https://www.gnu.org/software/coreutils/

コメント