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

MiniTool_ad

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

Linuxコマンドでの文字の置換の方法としては、sedやawkなどいろいろなアプローチがありますが、ここではtrコマンドを使用した置換方法を紹介します。

動作環境

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

# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

書式とオプション

書式

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

Memo1

trコマンドは、文字を置換するコマンドで、文字列を置換するコマンドではありません。

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

Memo2

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

主なオプション

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

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

主な文字クラス

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

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

使用例

アルファベットの小文字(または大文字)に置換する

アルファベットの小文字を大文字にする場合

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

アルファベットの大文字を小文字にする場合

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

例として、コマンド「tr --version」の実行結果を全て大文字すると以下のようになります。

# tr --version

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]'

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。

ファイル内容を処理対象として置換する

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

やり方1:

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

やり方2:

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

指定した文字を削除する

「-d」オプションを使うと、指定した文字を削除することができます。例えば、ファイル内の「:」をすべて削除して、その内容を別のファイルに保存する場合は以下のように実行します。

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

あとがき

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