【Linux】trコマンドの使い方|文字の置換・削除・連続文字の圧縮

【Linux】trコマンドの使い方|文字の置換・削除・連続文字の圧縮

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:6,325

Linuxのtrコマンドを使って、標準入力のテキストから文字単位で置換・削除・連続文字の圧縮を行う方法を解説します。大文字・小文字の変換、改行や不要な記号の削除、スペースの圧縮によるcutコマンドとの連携など、実務のシェルスクリプトやログ整形で役立つ使い方を具体例付きで紹介します。

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

初心者向け

わかばちゃんと学ぶ サーバー監視

難易度
実用性
読みやすさ

マンガと図解が中心で圧倒的に読みやすい。負荷調査の手法がスッと理解できるようになります。

新しいLinuxの教科書 第2版

難易度
実用性
読みやすさ

一生モノの基礎知識が身につく定番書です。

ゼロからわかる Linuxコマンド200本ノック―基礎知識と頻出コマンドを無理なく記憶に焼きつけよう!

難易度
実用性
習得度

アウトプット重視で記憶に定着しやすい。反復練習でLinux操作が自由自在になります。

エンジニア1年生のための世界一わかりやすいLinuxコマンドの教科書

難易度
実用性
読みやすさ

LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルでログファイルやコマンドの出力結果を整形する際、「大文字を小文字に揃えたい」「改行コードやカンマなどの不要な文字を取り除きたい」「連続するスペースを1つにまとめたい」といった場面は頻繁にあります。

この記事では、標準入力から受け取ったテキストを文字単位で置換・削除・圧縮できる tr(translate)コマンドの使い方を解説します。基本オプションの動作から、パイプラインやシェルスクリプトでの実践的な活用例、sed コマンドとの使い分けまでを具体例とともに紹介します。

この記事を読むことで、tr コマンドの特性を正しく理解し、日々のデータ整形やログ解析をシンプルかつ正確に記述できるようになります。

確認した環境

本記事で解説するコマンドや出力結果は、以下の環境で実機検証を行っています(バージョン確認コマンド: tr --version)。

OSOS [オーエス]Operating System。基本ソフトウェアGNU coreutils バージョン
DebianDebian [デビアン]コミュニティ主導で開発される安定性の高いLinuxディストリビューション GNU/Linux 11 (bullseye)GNU coreutils 8.32(tr (GNU coreutils) 8.32)
UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 24.04 LTSGNU coreutils 9.4(tr (GNU coreutils) 9.4)
AlmaLinux 9.4GNU coreutils 8.32(tr (GNU coreutils) 8.32)

Linuxのtrコマンドとは?文字単位で置換・削除する基本機能

tr コマンドは、標準入力から受け取ったテキストに対して、文字単位で置換・削除・連続文字の圧縮を行い、結果を標準出力へ書き出すフィルタコマンドです。コマンド名の tr は「translate(変換する)」または「transliterate(字訳する)」に由来します。

trコマンドの特徴とsed・awkとの違い

GNU tr の特徴は、「単語(文字列)単位」ではなく、入力データを文字セットに基づいて変換・削除する点にあります。ただし、GNU tr が完全にサポートするのは、1バイトで1文字を表現するシングルバイトロケールです。UTF-8などのマルチバイト文字については、文字単位で正しく処理できない場合があります。

Linuxの代表的なテキスト処理コマンドである sed や awk との違いは以下の通りです。

コマンド処理の単位・特徴向いている用途
tr1文字単位の対応付けで置換・削除・連続圧縮を行う(標準入力のみ受付)大文字・小文字変換、改行や制御文字の削除、連続スペースの圧縮
sed正規表現を用いた文字列パターン単位の置換、行の削除・挿入が可能単語や文字列の置換、特定パターンの行編集、ファイルの直接上書き(-i)
awk列(フィールド)単位の抽出や条件分岐、数値計算が可能空白・区切り文字で分割されたログの列抽出、集計処理

単純な1文字ずつの変換や特定文字の除去であれば、正規表現のエスケープを気にせず直感的に記述できる tr コマンドが適しています。一方、「apple という単語を orange に置き換える」といった文字列単位の置換には、sedコマンドによる文字列置換を使用します。

基本構文と「ファイル名を直接指定できない」注意点

tr コマンドの基本構文は以下の通りです。

Terminal window
tr [オプション] <文字セット1> [文字セット2]

ここで重要なルールとして、tr コマンドは引数にファイル名を直接指定できません。常に標準入力(stdin)からデータを受け取る仕様になっています。

もし引数にファイル名を渡すと、以下のように「余分なオペランド(引数)がある」というエラーになります。

Terminal window
$ tr 'a-z' 'A-Z' dummy.txt
tr: extra operand ‘dummy.txt’
Try 'tr --help' for more information.

ファイルの内容を tr コマンドで処理したい場合は、入力リダイレクト(<)を使うか、前段のコマンドからパイプ(|)で標準入力へ渡します。

Terminal window
# 方法1: 入力リダイレクト(<)でファイルを渡す
tr 'a-z' 'A-Z' < input.txt
# 方法2: コマンドの出力をパイプ(|)で渡す
echo "hello world" | tr 'a-z' 'A-Z'

主なオプション一覧

tr コマンドでよく使用する4つのオプション(およびオプションなしの動作)は以下の通りです。

オプション長い形式役割
オプションなし-<文字セット1> に含まれる文字を、<文字セット2> の同じ位置にある文字へ置換する
-d--delete<文字セット1> に含まれる文字を削除する(<文字セット2> は指定しない)
-s--squeeze-repeats指定した文字セットに含まれる連続文字を1文字に圧縮する。単独で使用する場合は <文字セット1>、文字の置換または削除と併用する場合は <文字セット2> に含まれる文字が圧縮対象となる
-c(または -C)--complement<文字セット1> の補集合(指定した文字以外のすべての文字)を対象にする
-t--truncate-set1<文字セット1> の長さを <文字セット2> の長さに切り詰めてから置換する

文字セット(SET)の指定方法と文字クラス

<文字セット1> や <文字セット2> には、直接文字を並べるだけでなく、範囲指定やエスケープシーケンス、POSIX文字クラスを利用できます。なお、POSIX文字クラスが表す文字の分類はロケールに応じて決まります。

指定方法記述例意味
範囲指定'a-z', '0-9'a から z までの小文字、0 から 9 までの数字
エスケープ文字'\n', '\r', '\t'改行(LF)、キャリッジリターン(CR)、タブ文字
[:lower:]'[:lower:]'小文字
[:upper:]'[:upper:]'大文字
[:digit:]'[:digit:]'数字
[:alnum:]'[:alnum:]'英字と数字
[:space:]'[:space:]'空白文字(スペース、タブ、改行など)
[:blank:]'[:blank:]'水平方向の空白文字(スペースとタブのみ、改行は含まない)

ポイント: シェルによる記号の展開(パス名展開など)を防ぐため、文字セットはシングルクォート('...')またはダブルクォート("...")で囲んで指定する習慣をつけましょう。

【基本】trコマンドで文字を置換・変換する方法

オプションを付けずに <文字セット1> と <文字セット2> の2つを指定すると、<文字セット1> のN番目の文字が <文字セット2> のN番目の文字に1対1で置換されます。

英字の大文字・小文字を一括変換する

アルファベットの小文字を大文字に、あるいは大文字を小文字に変換する処理は、tr コマンドの代表的な用途です。範囲指定('a-z' と 'A-Z')またはPOSIX文字クラス('[:lower:]' と '[:upper:]')を使用します。

Terminal window
# 小文字を大文字に変換する
$ echo "hello world" | tr 'a-z' 'A-Z'
HELLO WORLD
# ロケールに応じた大小文字変換(POSIX文字クラスを使用)
$ echo "Hello World 123" | tr '[:upper:]' '[:lower:]'
hello world 123
# CロケールでASCII英字を変換する
$ echo "Hello World 123" | LC_ALL=C tr 'A-Z' 'a-z'
hello world 123

a-z のような範囲指定は C ロケール以外の環境では文字の順序によって移植性に問題が生じる場合がある一方、ロケールに応じた英字の大文字・小文字変換を行いたい場合は、POSIX文字クラスの '[:lower:]' と '[:upper:]' を組み合わせて使用できます。なお、ASCII英字だけを対象としてロケールによる違いを避けたい場合は、上記のように LC_ALL=C を指定して実行する方法もあります。

区切り文字を変換する(カンマからタブ・コロンから改行)

カンマ区切りのテキストのカンマ(,)をタブ(\t)に置き換えたり、環境変数 PATH のコロン(:)を改行(\n)に置き換えて1行ずつ見やすく一覧表示したりする場合にも便利です。

Terminal window
# カンマ区切りをタブ区切りに変換する
$ printf "apple,banana,orange\n" | tr ',' '\t'
apple banana orange
# コロン区切りのパス一覧を改行に変換して1行ずつ表示する
$ echo "/usr/local/bin:/usr/bin:/bin" | tr ':' '\n'
/usr/local/bin
/usr/bin
/bin

なお、上記の方法は単純なカンマ区切りのテキストを対象としています。一般的なCSVCSV [シーエスブイ]Comma-Separated Values。カンマ区切りのデータ形式ファイルには apple,"banana,orange",grape のように引用符(")で囲まれたフィールド内にカンマが含まれる場合があり、tr ではフィールド内のカンマまでタブに変換されてしまいます。正式なCSVファイルをTSV形式に変換する場合は、CSV形式を解析できる専用ツールやプログラム(PythonPython [パイソン]汎用プログラミング言語の csv モジュールなど)を使用してください。

逆に、複数行のテキストの改行(\n)をカンマ(,)に置換して1行にまとめることも可能です。

Terminal window
$ printf "line1\nline2\nline3\n" | tr '\n' ','
line1,line2,line3,

末尾の改行もカンマに変換されるため、出力の最後に改行を補いたい場合は続けて echo "" を実行するか、paste -sd',' コマンドの利用も検討してください。

注意点:文字列(単語)の置換ではなく1文字ずつの対応になる

tr コマンドを使う際に初心者がつまずきやすいのが、「単語の置換」として使ってしまうケースです。例えば、apple を orange に置換しようとして以下のコマンドを実行すると、意図しない結果になります。

Terminal window
$ echo "apple pie" | tr 'apple' 'orange'
oaang aig

これは、tr が <文字セット1>(a, p, p, l, e)と <文字セット2>(o, r, a, n, g, e)を先頭から1文字ずつ対応付けるためです。GNU tr では、<文字セット1> に同じ文字が複数回登場する場合、最後に登場した位置の対応関係が採用されます(また、<文字セット2> の余剰文字は無視されます)。

  • a → o
  • p → a(3文字目の対応が採用される)
  • l → n
  • e → g

この結果、apple pie は oaang aig に変換されます。このように tr はあくまで1文字単位の変換ツールです。単語や文字列パターンを置換したい場合は、sed 's/apple/orange/g' を使用してください。

また、<文字セット1> の文字数が <文字セット2> より多い場合(例: tr 'abc' 'XY')、GNU tr のデフォルト動作では <文字セット2> の最後の文字(Y)が繰り返されて補完されます。<文字セット2> の長さに合わせて <文字セット1> の余分な文字を無視したい場合は -t オプションを付与します。

Terminal window
# デフォルト:3文字目の 'c' も 'Y' に置換される
$ echo "abcdef" | tr 'abc' 'XY'
XYYdef
# -t オプション:SET2の長さに切り詰められ、'c' は置換されない
$ echo "abcdef" | tr -t 'abc' 'XY'
XYcdef

なお、-t(--truncate-set1)はGNU tr などで利用できる拡張オプションです。POSIX準拠の環境を含め、異なる実装間でスクリプトを移植する場合は注意してください。

【削除・抽出】-d・-cオプションで不要な文字を取り除く

-d(--delete)オプションを使用すると、指定した <文字セット1> に含まれる文字をすべて削除できます。さらに -c(--complement)オプションと組み合わせることで、「指定した文字だけを残す(それ以外を削除する)」という抽出処理も可能になります。

特定の記号やハイフン・カンマを削除する(-d)

電話番号や日付のハイフン(-)、金額データの桁区切りカンマ(,)などを取り除いて数値データに整形する例です。

Terminal window
# 日付からハイフンを削除する
$ echo "2026-11-07" | tr -d '-'
20261107
# 数値の桁区切りカンマを削除する
$ echo "1,000,000" | tr -d ','
1000000

Windowsの改行コード(CRLF)からCR(\r)を削除する

Windows環境で作成されたテキストファイルやスクリプトをLinuxへ持ち込むと、行末に \r\n(CRLF)が含まれており、シェルスクリプトの実行時エラー(bad interpreter 等)の原因になることがあります。tr -d '\r' を使うと、キャリッジリターン(\r)だけを取り除いてLinux標準の \n(LF)に変換できます。

Terminal window
# \r\n を含むテキストから \r を削除し、od -c で改行コードを確認する
$ printf "line1\r\nline2\r\n" | tr -d '\r' | od -c
0000000 l i n e 1 \n l i n e 2 \n
0000014

ファイルを変換して別ファイルへ保存する場合は、以下のように入力リダイレクトと出力リダイレクトを組み合わせます。

Terminal window
tr -d '\r' < win_script.sh > linux_script.sh

注意: tr -d '\r' < file.sh > file.sh のように入力元と出力先に同じファイルを指定してはいけません。リダイレクト(>)が先にファイルを空に切り詰めてしまうため、中身が消えてしまいます。必ず別ファイルに出力してから置き換えてください。

補集合(-c)と組み合わせて特定の文字だけを抽出する(-cd)

-c オプションは <文字セット1> に指定した文字以外(補集合)を対象にします。-d と組み合わせた -cd(または -dc)を使うと、「指定した文字以外をすべて削除する=指定した文字だけを抜き出す」という処理が簡潔に書けます。

Terminal window
# 数字(0-9)と改行(\n)以外の文字をすべて削除し、数字だけを抽出する
$ echo "User_01:12345" | tr -cd '0-9\n'
0112345

ここで <文字セット1> に \n(改行)を含めているのが実務上のポイントです。\n を含めずに tr -cd '0-9' と実行すると、末尾の改行コードまで「数字以外の文字」として削除されてしまい、ターミナルのプロンプト表示が崩れたり、複数行のファイルがすべて1行に繋がったりするため注意してください。

【圧縮】-sオプションで連続する空白や改行を1つにまとめる

-s(--squeeze-repeats)オプションは、指定した文字が2文字以上連続して並んでいる場合に、それを1文字に圧縮(統合)します。

単独で -s を使用する場合は <文字セット1> が圧縮対象になりますが、置換や削除(-d)と併用する場合は <文字セット2> に含まれる文字が圧縮対象になります。例えば削除と併用(-ds)する場合は、<文字セット1> の文字を削除した後に、<文字セット2> に含まれる文字の連続を圧縮します。

Terminal window
# x を削除した後、連続する a を1文字に圧縮する
$ echo "xaaaxaa" | tr -ds 'x' 'a'
a

連続するスペースを1つに圧縮してcutコマンドと連携する

ps や ls -l、df などのコマンド出力は、見た目を揃えるために複数のスペースで列が区切られています。一方で、cutコマンドは「連続するスペース」をそれぞれ別々の区切り文字として扱ってしまうため、そのままでは意図した列を取り出せません。

そこで、前段で tr -s ' ' を実行して連続するスペースを1つに圧縮してから cut -d' ' に渡すと、空白区切りのテキストから特定の列を取り出せるようになります。

Terminal window
# 連続するスペースを1つに圧縮する
$ echo "a b c" | tr -s ' '
a b c
# スペースを圧縮してから cut コマンドで2列目を取り出す
$ echo "a b c" | tr -s ' ' | cut -d' ' -f2
b

実務での補足: tr -s ' ' は連続するスペースを1つにまとめますが、行頭にあるスペース自体は削除しません。コマンド出力の行頭にスペースが入る場合(ps や wc の一部出力など)は、行頭・行末の空白を自動で無視して列分割できる awkコマンドのprint処理(awk '{print $2}')を使うほうが安全です。

空行(連続する改行)を詰めて除去する

テキストファイル内に複数の空行(連続する \n)が含まれている場合、tr -s '\n' を使うと連続する改行を1つに圧縮し、空行を詰めることができます。

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

なお、スペースやタブのみが含まれる「見た目の空行」は \n が連続していないため、tr -s '\n' だけでは除去できません。空白文字(半角スペースやタブ)だけの行も含めて空行を削除したい場合は、以下のように grep や sed を利用してください。

Terminal window
# 空白文字だけの行を除外する
grep -v '^[[:space:]]*$'
# 空白文字だけの行を削除する
sed '/^[[:space:]]*$/d'

日本語(マルチバイト文字)を扱う際の制限と代替手段

GNU coreutils に含まれる標準の tr コマンドを扱う上で知っておくべき重要な仕様として、マルチバイト文字(UTF-8の日本語など)への制限があります。

GNU tr が完全にサポートするのは1バイトで1文字を表現するシングルバイトロケールであり、内部ではバイト単位で処理されます。UTF-8の日本語(ひらがな・漢字・全角英数字など)は1文字あたり3バイト以上で構成されるため、tr で全角文字を置換・削除しようとすると、文字単位で正しく処理できず、意図しない変換や文字化けが発生します。

日本語や全角文字を含む置換・削除を行う場合は、マルチバイト文字に対応した以下のコマンドへ切り替えてください。

やりたい処理推奨する代替コマンド例
日本語や文字列の置換・削除sed 's/置換前/置換後/g'、sed 's/削除したい文字//g'
全角英数字・半角カナなどの文字種変換nkf コマンド、または Python / Perl の文字変換処理
列の抽出・マルチバイト文字の切り出しawk コマンド

例えば、日本語の文字列を安全に置換する場合は、sed コマンドを使って以下のように記述します。

Terminal window
$ echo "りんご,みかん" | sed 's/りんご/バナナ/g'
バナナ,みかん

このように、ASCII文字(半角英数字・記号・制御文字)の1文字変換には tr を使い、マルチバイト文字や単語単位の置換には sed を使うという基準を持っておくと、文字化けのトラブルを防げます。

まとめ:trコマンドでシンプルな文字変換・整形を効率化しよう

本記事では、Linuxの tr コマンドによる文字の置換・削除・連続文字の圧縮について解説しました。

記事の要点を以下にまとめます。

  • tr コマンドは標準入力(パイプや < リダイレクト)からのみデータを受け取り、文字セットに基づいて文字の変換・削除・圧縮を行う(完全にサポートされるのはシングルバイトロケール)。
  • オプションなしで <文字セット1> と <文字セット2> を指定すると、大文字・小文字の変換(tr '[:lower:]' '[:upper:]' や LC_ALL=C tr 'a-z' 'A-Z')や区切り文字の変換が行える。
  • -d オプションで不要な記号や改行コード(\r など)を削除でき、-cd を組み合わせれば数字などの特定文字だけを抽出できる。
  • -s オプションを使うと連続するスペースや改行を1文字に圧縮でき、cut コマンドの前処理として活用できる。
  • 単語(文字列)単位の置換やUTF-8の日本語処理には向かないため、それらの用途では sed や awk と適切に使い分ける。

1文字単位のシンプルな整形処理において、tr コマンドはパイプラインの途中で手軽に組み込める便利なツールです。ほかのテキスト処理コマンドと組み合わせた活用法については、Linuxのテキスト処理・検索コマンドの使い方まとめもあわせて参考にしてください。


以上で本記事の解説を終わります。
よいITライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

人気記事


記事を評価

Thanks!
目次
Scroll to Top