Linuxを使っていると、テキスト内の小文字を大文字に変換したり、特定の文字を削除したり、連続する空白を1つにまとめたりしたい場面があります。
このようなときに便利なのが、trコマンドです。
trコマンドを使用すると、文字を別の文字に置き換えたり、特定の文字を削除したり、連続している同じ文字を1文字にまとめたりできます。
この記事では、Linuxのtrコマンドの基本的な使い方から、よく使うオプションや他のLinuxコマンドとの組み合わせまで、初心者向けにわかりやすく解説します。
Linuxのtrコマンドとは?
trコマンドとは、標準入力から受け取った文字列に対して、文字の置換・削除・連続する文字の圧縮などを行うコマンドです。
trは「translate」に由来する名前で、標準入力から受け取った文字を指定したルールに従って変換し、標準出力へ出力します。
例えば、小文字を大文字に変換する場合は、次のコマンドを実行します。
echo "hello" | tr '[:lower:]' '[:upper:]'
# 実行結果
HELLOこの例では、echoコマンドが出力したhelloをパイプ(|)でtrコマンドに渡し、小文字を大文字に変換しています。
trコマンドの基本構文
trコマンドの基本構文は次のとおりです。
tr [オプション] SET1 [SET2]| 項目 | 説明 |
tr | 文字を置換・削除・圧縮するコマンド |
| オプション | 処理方法を指定する |
SET1 | 置換・削除などの対象となる文字の集合 |
SET2 | 置換後の文字の集合(処理によっては省略可能) |
文字を置換する場合は、SET1に変換対象の文字、SET2に変換後の文字を指定します。
例えば、aをAに変換する場合は、次のコマンドを実行します。
echo "apple" | tr 'a' 'A'
# 実行結果
AppleSET1に指定したaが、SET2に指定したAへ置き換えられています。
trコマンドは通常、標準入力からデータを受け取るため、echoやcatなどのコマンドや入力リダイレクトと組み合わせて使用します。
trコマンドのインストール方法
UbuntuやDebian系のLinuxでは、trコマンドは通常、GNU coreutilsという基本的なコマンド群に含まれており、標準で使用できます。
インストールされているか確認する場合は、次のコマンドを実行します。
tr --version
# 実行結果(例)
tr (GNU coreutils) 9.4バージョン情報が表示されれば、trコマンドを使用できる状態です。表示されるバージョンはLinux環境によって異なります。
もしtrコマンドが使用できない場合、UbuntuやDebian系のLinuxでは次のコマンドでcoreutilsをインストールできます。
sudo apt update
sudo apt install coreutilstrコマンドの使い方
ここからは、trコマンドの基本的な使い方を順番に説明します。
特定の文字を置換する
文字を置換する場合は、SET1に置換対象の文字、SET2に置換後の文字を指定します。
例えば、文字列に含まれるaをXに置換する場合は、次のコマンドを実行します。
echo "banana" | tr 'a' 'X'
# 実行結果
bXnXnXbananaに含まれるすべてのaがXに置換されています。
複数の文字をまとめて置換することもできます。
echo "apple" | tr 'ap' 'XY'
# 実行結果
XYYle| 置換対象 | 置換後 |
a | X |
p | Y |
つまり、apという文字列全体をXYへ置換しているのではなく、aをX、pをYに置換しています。
小文字を大文字に変換する
小文字を大文字に変換する場合は、[:lower:]と[:upper:]を使用できます。
echo "hello world" | tr '[:lower:]' '[:upper:]'
# 実行結果
HELLO WORLD[:lower:]は小文字、[:upper:]は大文字を表す文字クラスです。
逆に、大文字を小文字へ変換する場合は、次のように指定します。
echo "HELLO WORLD" | tr '[:upper:]' '[:lower:]'
# 実行結果
hello worlda-zとA-Zを使用して、次のように記述することもできます。
echo "hello world" | tr 'a-z' 'A-Z'
# 実行結果
HELLO WORLDここで紹介している例は、英語のアルファベットを対象としています。
数字を別の文字に置換する
数字も同じように置換できます。
例えば、0から9までの数字をすべてXに置換する場合は、次のコマンドを実行します。
echo "abc123def456" | tr '0-9' 'X'
# 実行結果
abcXXXdefXXXGNU版のtrでは、SET2の文字数がSET1より少ない場合、SET2の最後の文字を繰り返して対応させます。そのため、この例では0から9までのすべての数字がXへ置換されます。
特定の文字を削除する
特定の文字を削除する場合は、-dオプションを使用します。
echo "banana" | tr -d 'a'
# 実行結果
bnn-dを指定すると、SET1に含まれる文字がすべて削除されます。
複数の文字を削除することもできます。
echo "hello world" | tr -d 'aiueo'
# 実行結果
hll wrld数字だけを削除する
数字を削除する場合は、0-9または[:digit:]を指定できます。
echo "abc123def456" | tr -d '[:digit:]'
# 実行結果
abcdef指定した文字以外を削除する
指定した文字以外を削除したい場合は、-cと-dを組み合わせます。
echo "abc123def456" | tr -cd '0-9'
# 実行結果
123456-cは指定した文字以外を処理対象にし、-dは対象となった文字を削除します。そのため、この例では0-9以外の文字がすべて削除され、数字だけが残ります。
改行も削除対象となるため、このコマンドの実行結果の末尾には改行が含まれません。
連続する文字を1つにまとめる
連続する同じ文字を1つにまとめる場合は、-sオプションを使用します。
echo "aaabbbccc" | tr -s 'abc'
# 実行結果
abca、b、cがそれぞれ連続している部分が、1文字にまとめられています。
特定の文字だけを対象にすることもできます。
echo "aaabbbccc" | tr -s 'a'
# 実行結果
abbbccc連続する空白を1つにまとめる
-sオプションを使用すると、複数の半角スペースを1つにまとめることもできます。
echo "hello world" | tr -s ' '
# 実行結果
hello worldスペースやタブなどの水平方向の空白文字を対象にしたい場合は、[:blank:]を使用できます。
printf 'hello world\n' | tr -s '[:blank:]'
# 実行結果
hello world[:blank:]は、スペースやタブなどの水平方向の空白文字を表します。ただし、スペースとタブは別々の文字として扱われるため、異なる種類の空白が連続している場合は、必ずしも1文字にまとまるわけではありません。
タブを半角スペースに置換する
タブを半角スペースに置換する場合は、\tを指定します。
printf 'hello\tworld\n' | tr '\t' ' '
# 実行結果
hello world特定の文字を改行に置換する
カンマ区切りの文字列を1項目ずつ改行して表示することもできます。
echo "red,blue,green" | tr ',' '\n'
# 実行結果
red
blue
green\nは改行を表します。
逆に、改行をカンマへ置換することもできます。
printf 'red\nblue\ngreen\n' | tr '\n' ','
# 実行結果
red,blue,green,最後の改行もカンマへ置換されるため、実行結果の末尾にもカンマが付きます。
文字の置換と圧縮を同時に行う
-sオプションは、文字の置換と組み合わせることもできます。
echo "aabbcc" | tr -s 'abc' 'X'
# 実行結果
Xこのコマンドでは、まずa、b、cがXへ置換され、その後に連続するXが1文字にまとめられます。
trコマンドはファイル名を直接指定しない
trコマンドを使用する際に注意したいのが、基本的に処理するファイル名を直接指定しないことです。
例えば、次のような書き方はできません。
tr 'a-z' 'A-Z' sample.txtファイルの内容をtrコマンドで処理する場合は、入力リダイレクト(<)を使用します。
tr 'a-z' 'A-Z' < sample.txtまた、catコマンドとパイプを組み合わせて、次のように記述することもできます。
cat sample.txt | tr 'a-z' 'A-Z'どちらの場合も、sample.txtの内容が標準入力としてtrコマンドに渡されます。ファイルを処理するだけであれば、catコマンドを使用せず、< sample.txtとする方が簡潔です。
変換した結果をファイルに保存する
trコマンドの実行結果をファイルへ保存する場合は、出力リダイレクト(>)を使用します。
例えば、sample.txtの小文字を大文字へ変換し、converted.txtへ保存する場合は、次のコマンドを実行します。
tr 'a-z' 'A-Z' < sample.txt > converted.txtこれで、元のsample.txtを残したまま、大文字へ変換された内容がconverted.txtに保存されます。
tr 'a-z' 'A-Z' < sample.txt > sample.txtのように、入力ファイルと出力ファイルへ同じファイル名を指定しないようにしてください。シェルがsample.txtを先に空にしてしまうため、正しく変換できません。
trコマンドの主なオプション
| オプション | 説明 |
-d / --delete | 指定した文字を削除する |
-s / --squeeze-repeats | 連続する同じ文字を1文字にまとめる |
-c / --complement | 指定した文字以外を対象にする |
-C | 指定した文字以外を対象にする |
-t / --truncate-set1 | SET1をSET2の文字数に合わせて切り詰める |
--help | ヘルプを表示する |
--version | バージョンを表示する |
まずは、使用頻度の高い-d、-s、-cを覚えておくとよいでしょう。
trコマンドで使用できる文字クラス
trコマンドでは、文字を1つずつ指定するだけでなく、文字クラスを使用して特定の種類の文字をまとめて指定できます。
よく使用する文字クラスは次のとおりです。
| 文字クラス | 説明 |
[:lower:] | 小文字 |
[:upper:] | 大文字 |
[:alpha:] | アルファベットなどの文字 |
[:digit:] | 数字 |
[:alnum:] | 英数字 |
[:space:] | スペース・タブ・改行などの空白文字 |
[:blank:] | スペース・タブなどの水平空白文字 |
[:punct:] | 句読点や記号 |
[:print:] | 表示可能な文字 |
[:cntrl:] | 制御文字 |
[:xdigit:] | 16進数で使用する文字 |
例えば、数字を削除する場合は、次のように指定します。
echo "abc123def456" | tr -d '[:digit:]'
# 実行結果
abcdef文字クラスを使用すると、対象となる文字を1文字ずつ指定する必要がないため、処理内容もわかりやすくなります。
trコマンドで使用できる特殊文字
trコマンドでは、改行やタブなどを表す特殊文字も使用できます。
主な特殊文字は次のとおりです。
| 特殊文字 | 説明 |
\n | 改行 |
\t | タブ |
\r | キャリッジリターン |
\\ | バックスラッシュ |
例えば、改行を半角スペースへ置換する場合は、次のコマンドを実行します。
printf 'hello\nworld\n' | tr '\n' ' '
# 実行結果
hello world 最後の改行も半角スペースへ置換されるため、実行結果の末尾にも半角スペースが含まれます。
trコマンドと他のコマンドを組み合わせる方法
trコマンドは、他のLinuxコマンドと組み合わせることで、さまざまなテキスト処理に活用できます。
echoコマンドと組み合わせる
echoコマンドで出力した文字列を、パイプ(|)でtrコマンドへ渡せます。
echo "hello world" | tr 'a-z' 'A-Z'
# 実行結果
HELLO WORLDechoで出力した文字列がtrへ渡され、小文字が大文字に変換されます。
catコマンドと組み合わせる
catコマンドで表示したファイルの内容を、パイプ(|)でtrコマンドへ渡すこともできます。
cat sample.txt | tr 'a-z' 'A-Z'ただし、ファイルを直接処理するだけであれば、次のように入力リダイレクトを使用する方が簡潔です。
tr 'a-z' 'A-Z' < sample.txtsortコマンドと組み合わせる
sortコマンドと組み合わせると、文字を変換した後に並べ替えることができます。
tr 'a-z' 'A-Z' < fruits.txt | sort
# 実行結果
APPLE
BANANA
CHERRYgrepコマンドと組み合わせる
grepコマンドと組み合わせることで、文字を変換してから特定の文字列を検索できます。
tr 'a-z' 'A-Z' < sample.txt | grep 'HELLO'
# 実行結果
HELLO WORLD
HELLO LINUXなお、大文字・小文字を区別せずに検索するだけであれば、grep -iを使用する方法もあります。
trコマンドでよく使う指定方法の一覧
| 指定方法 | 説明 |
tr 'a' 'X' | aをXに置換する |
tr 'a-z' 'A-Z' | 小文字を大文字に変換する |
tr 'A-Z' 'a-z' | 大文字を小文字に変換する |
tr '0-9' 'X' | 数字をXに置換する |
tr -d 'a' | aを削除する |
tr -d '0-9' | 数字を削除する |
tr -cd '0-9' | 数字以外を削除する |
tr -s ' ' | 連続する半角スペースを1つにまとめる |
tr '\t' ' ' | タブを半角スペースに置換する |
tr ',' '\n' | カンマを改行に置換する |
tr -t 'abc' 'XY' | aとbだけをXとYに置換する |
trコマンドを使用するときの注意点
trは文字単位で処理するコマンド
trコマンドは、文字列全体ではなく、基本的に1文字ずつ置換・削除するコマンドです。
echo "apple" | tr 'ap' 'XY'
# 実行結果
XYYleapという文字列全体をXYへ置換しているのではなく、aをX、pをYへ置換しています。
単語や複数文字からなる文字列をまとめて置換したい場合は、sedコマンドなどを使用します。
日本語などのマルチバイト文字の処理には注意する
GNU版のtrでは、UTF-8などの複数バイトで表現される文字を期待どおりに処理できない場合があります。そのため、日本語の1文字を別の日本語へ置換するといった処理には適していません。日本語などのマルチバイト文字を扱う場合は、sedやPythonなど、文字コードを適切に扱えるツールを使用する方がよいでしょう。
trでは正規表現を使用しない
trで指定するSET1とSET2は、正規表現ではありません。
例えば、a-zは文字の範囲を表しますが、.*や[0-9]+などの正規表現を使用して文字列全体を検索・置換することはできません。
正規表現を使用した複雑な文字列処理を行いたい場合は、sedやawkなどを使用します。
trコマンドは元のファイルを直接変更しない
trコマンドで文字を置換・削除しても、元のファイルは通常変更されません。
tr 'a-z' 'A-Z' < sample.txt変更した結果を保存したい場合は、別のファイルへリダイレクトします。
tr 'a-z' 'A-Z' < sample.txt > converted.txt本記事のまとめ
この記事では「Linuxのtrコマンド」について、以下の内容を説明しました。
trコマンドは文字の置換・削除・圧縮を行うためのコマンド- 文字の置換では
SET1とSET2を指定する -dで削除、-sで連続する文字の圧縮ができる-cや文字クラスを使用して処理対象を指定できる- 入力リダイレクトやパイプを使用して、ファイルや他のコマンドの出力を処理できる
trコマンドは、単純な文字の置換や削除をコマンドラインから手軽に行いたい場合に便利です。
特に、-dや-s、文字クラスと組み合わせることで、テキストデータの簡単な整形にも活用できます。
お読みいただきありがとうございました。