ここでは、Linuxで文字を置換する方法として、trコマンドやsedコマンドを使って文字や文字列を置換する方法を紹介します。
目次
trコマンドの書式とオプション
trコマンドは文字を置換するコマンドで、使い方は以下のとおりです。
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コマンドの使用例
たとえば、以下の実行例では、コマンド「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 | 入力ファイルを直接編集します。 |
sedコマンドの使用例
ファイルfile1.txt内の文字列「abc」を「ABC」に置換してfile2.txtに保存たいときは、以下のように実行します。
sedコマンドの実行結果は、デフォルトでは標準出力に書き出されるので、結果を保存したい場合にはリダイレクトなどを利用します。
# sed s/abc/ABC/ file1.txt > file2.txt
Windows環境で作成したファイルfile1.txtの改行コード(CRLF)を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コマンドはテキスト処理のコマンドとして有用なので、覚えておいて損はないです。