Linuxコマンドで文字列を置換する方法(tr, sed)

Linuxコマンドで文字列を置換する方法(tr, sed)

Linuxコマンドで文字を置換したい場合、trやsedといったコマンドが利用できます。

そこでここでは、trコマンドやsedコマンドを使って文字や文字列を置換する方法を紹介します。

この記事は、以下の環境での動作結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。

ソフトウェアバージョン
CentOS Linux7.4.1708

trコマンドの使い方

trコマンドは文字を置換するコマンドで、使い方は以下のとおりです。

Memo

trコマンドは、文字を置換するコマンドで、文字列を置換するコマンドではありません。たとえば「tr 012 abc」を実行すると「0」を「a」に、「1」を「b」に、「2」を「c」に置き換えます。「012」という連続した文字列を「abc」に置き換えているのではないということに注意してください。

また、trコマンドは標準入力からデータを読み込んで変換を行うため、「tr '[a-z]' '[A-Z]' test.txt」のように、引数にファイル名を指定することはできません。

書式

tr [オプション]... 文字セット1 [文字セット2]

主なオプション

主なオプションは、以下のとおりです。

オプション説明
-d[文字セット1]に含まれる文字があったら削除します。
-s[文字セット1]に含まれる文字が連続していたら1つにまとめます。

主な文字クラス

文字セットの代わりに、以下のような文字クラスを指定することもできます。

文字クラス説明
[:alnum:]アルファベットと数字
[:alpha:]アルファベット
[:digit:]数字
[:lower:]小文字アルファベット
[:space:]スペースや水平タブなど
[:upper:]大文字アルファベット

使用例

たとえば、コマンド「tr --version」の実行結果を全て大文字に置換したいときは、以下のように実行します。

# tr --version | tr '[a-z]' '[A-Z]'

TR (GNU COREUTILS) 8.22
COPYRIGHT (C) 2013 FREE SOFTWARE FOUNDATION, INC.
ライセンス GPLV3+: GNU GPL VERSION 3 OR LATER <HTTP://GNU.ORG/LICENSES/GPL.HTML>.
THIS IS FREE SOFTWARE: YOU ARE FREE TO CHANGE AND REDISTRIBUTE IT.
THERE IS NO WARRANTY, TO THE EXTENT PERMITTED BY LAW.

作者 JIM MEYERING。

逆に、すべてアルファベットの小文字に置換したいときは、以下のように実行します。

# tr --version |  tr '[A-Z]' '[a-z]'

ファイルの内容を処理対象にしたいときは、catコマンドとパイプを使用するか、リダイレクトでtrコマンドに変換対象となるデータを渡します。

# cat test.txt | tr '[a-z]' '[A-Z]'
# tr '[a-z]' '[A-Z]' <test.txt

「-d」オプションを使うと、指定した文字を削除することができます。

例えば、ファイルtest.txt内の「:」をすべて削除して、その内容をファイルtest2.txtに保存する場合は、以下のように実行します。

# tr -d ':' <test.txt >test2.txt

sedコマンドの使い方

sedコマンドは、入力されたテキストデータを1行ずつ読み込んで指定した処理を実行して出力するコマンドで、主に文字列の置換や抽出で利用します。

sedコマンドの使い方は、次のとおりです。

書式

sed [オプション] スクリプト 入力ファイル

主なオプション

主なオプションは、以下のとおりです。

オプション説明
-e実行するスクリプトを追加します。
-i入力ファイルを直接編集します。

使用例

ファイルfile1.txt内の文字列「abc」を「ABC」に置換してfile2.txtに保存たいときは、以下のように実行します。

Memo

sedコマンドの実行結果は、デフォルトでは標準出力に書き出されるので、結果を保存したい場合にはリダイレクトなどを利用します。

# sed s/abc/ABC/ file1.txt > file2.txt

Windows環境で作成したファイルfile1.txtの改行コード(CELF)をLinux環境用の改行コード(LF)に置換してfile2.txtに保存したいときは、以下のように実行します。

# sed sed "s/\r//" file1.txt > file2.txt

逆に、改行コードをLFからCRLFに置換したいときは、以下のように実行します。

# sed sed "s/$/\r/" file2.txt > file3.txt

ファイルfile1.txt内の文字列「abc」をすべて「ABC」に置換して、入力ファイルを直接更新したいときは、以下のように実行します。

# sed -i s/abc/ABC/ file1.txt

複数の条件(スクリプト)を指定したいときは「-e」オプションを利用します。たとえば、ファイルfile1.txt内の文字列「abc」をすべて「ABC」に、「yes」をすべて「no」に置換してfile2.txtに保存したいときは、以下のように実行します。

# sed -e s/abc/ABC/ -e s/yes/no/ file1.txt > file2.txt

lsコマンドの出力の1行目を削除したいときは、以下のように実行します。

# ls | sed 1d

lsコマンドの出力の1~5行目を削除したいときは、以下のように実行します。

# ls | sed 1,5d

ファイルfile1.txt内の「abc」から始まる行を削除したいときは、以下のように実行します。

# sed /^abc/d file1.txt

あとがき

trコマンドはあまり使う機会がありませんが、sedコマンドはテキスト処理のコマンドとして有用なので、覚えておいて損はないです。