tr – 文字の変換・削除を行うコマンド

コマンドリファレンス

tr コマンドは、標準入力から受け取った文字を 変換・削除 して標準出力に返すコマンドです。
実務では、アルファベットの大文字・小文字変換や、不要な文字の削除、改行の置換などに利用されます。

構文(Syntax)

tr [オプション] SET1 [SET2]

主なオプション一覧

オプション説明使用例
(なし)SET1 を SET2 に変換`echo “abc”
-d指定した文字を削除echo "hello123" | tr -d 0-9
-s連続する同じ文字を1つに圧縮echo "aaabbb" | tr -s ab
-cSET1 の補集合を対象にする(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文字クラスを使った変換

tra-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 が向いています。

用途trsed
1文字単位の変換・削除◎(高速・シンプル)△(記述が冗長)
複数文字列(単語)の置換×(非対応)◎(s/foo/bar/
正規表現マッチ×
行の削除・抽出×
日本語などマルチバイト文字△(非対応が多い)

単語単位の置換や正規表現が必要な場合は、sedawk の利用を検討してください。

よくある質問(FAQ)

Q. trで日本語(マルチバイト文字)を扱えないのはなぜ?

A. tr は基本的に1バイト=1文字として処理するため、UTF-8の日本語のような複数バイト文字は正しく扱えないことがあります。日本語を含む変換には sedawk、または iconv(文字コード変換)を使ってください。

Q. 複数文字を1文字にまとめて置換したい

A. tr は1文字対1文字の変換専用のため、”abc”を”X”のようにまとめる変換はできません。sed 's/abc/X/g' を使ってください。

Q. SET1とSET2の文字数が異なる場合はどうなる?

A. SET2がSET1より短い場合、SET2の最後の文字が繰り返し使われます(GNU tr の場合)。文字数を揃えるか、意図した挙動か確認してから使うのが安全です。

関連コマンド

  • cut : 特定の列や文字を抽出
  • sed : 文字列置換や削除を含む高度な編集
  • awk : 抽出・加工に特化したテキスト処理言語
  • iconv : 文字コード変換

備考

  • tr標準入力から標準出力へ の変換専用。直接ファイル指定はできない(リダイレクトで対応)。
  • マルチバイト文字(日本語など)には非対応のことが多い。基本的に ASCII 文字に利用。
  • 文字範囲は a-z, A-Z, 0-9 などで指定可能。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント