Linux の tr コマンドの使い方

tr コマンドはテキスト ストリームを変換し、新しいストリームを出力として生成します。コマンドラインで設定したルールに従って、文字を置換、削除、変換することができます。

Linux でテキスト ストリームを操作するための、余計な機能のない方法が必要ですか? 入力のテキストを置換、削除、結合、圧縮する際に時間を節約できる tr コマンドは、最適な方法です。その方法は次のとおりです。

tr コマンドとは?

Linux のtrコマンドは、テキスト ストリームから不要な文字を削除したり、その他の便利な操作を行ったりするための、高速でシンプルなユーティリティです。その名前は「変換」という言葉に由来しており、trのルーツは Unix の伝統に深く根ざしています。

ご存知のとおり、Linux は Unix のオープンソースによる書き換えです。独自の要素も追加されています。バイト単位のクローンではありませんが、設計原則とエンジニアリングの方向性は明らかに Unix オペレーティング システムから多くを継承しています。

POSIX 準拠の認定を受け、Unix の実装として正式に受け入れられた Linux ディストリビューションは EulerOS と Inspur K-UX の 2 つだけですが、Linux はビジネスの世界で Unix にほぼ完全に取って代わりました。

すべての Linux ディストリビューションは、少なくともそのコア ユーティリティでは、Unix の哲学を順守しています。Unix の哲学は、Unix の先駆者たちが新しいオペレーティング システムに抱いていたビジョンをカプセル化しています。それはしばしば「1 つのことをうまく行うプログラムを書く」と表現されます。しかし、それだけではなく、より多くの要素があります。

最も強力な革新の 1 つは、プログラムが出力を生成し、その出力を他のプログラムの入力として使用できるということでした。1 つのプログラムの出力ストリームを次のプログラムの入力ストリームとして使用して、コマンドライン ユーティリティを連鎖させることができる機能は、非常に強力です。

場合によっては、次のプログラムに渡す前に、1 つのプログラムからの出力を微調整または調整したい場合があります。あるいは、Linux コマンドライン ツールから入力を取得するのではなく、特定のニーズを念頭に置いて作成されていないファイルからテキストをストリーミングしていることもあります。

ここでtrが力を発揮します。入力ストリームに対して一連の単純な変換を実行し、出力ストリームを生成できます。その出力ストリームはファイルにリダイレクトしたり、別の Linux プログラムにフィードしたり、さらには別のtrインスタンスにフィードして、ストリームに複数の変換を適用したりすることができます。

文字の置換

trコマンドは、ルールに従って入力ストリームに対して動作します。コマンドライン オプションなしで使用すると、trのデフォルトの動作は、入力ストリーム内の文字を他の文字に置換することです。

trへのコマンドには通常、2 つの文字セットが必要です。最初のセットには、入力ストリームで見つかった場合に置換される文字が含まれます。2 番目のセットには、置換先の文字が含まれます。

これは、セット 1 の最初の文字の出現がセット 2 の最初の文字に置き換えられるように機能します。セット 1 の 2 番目の文字の出現はセット 2 の 2 番目の文字に置き換えられ、以降も同様です。

この例では、trの入力ストリームで文字「c」を検索し、その出現をすべて文字「z」に置き換えます。trは大文字と小文字を区別することに注意してください。

使用しています

<code>echo</code>

テキストをtrにプッシュします。

echo abcdefabc | tr 'c' 'z'

「c」のすべての出現が「z」に置き換えられ、新しい文字列がターミナル ウィンドウに書き込まれます。

今回は、2 文字「a」と「c」を検索します。「ac」を検索しているわけではないことに注意してください。「a」を検索してから「c」を検索しています。「a」の出現はすべて「x」に置き換え、「c」の出現はすべて「z」に置き換えられます。

echo abcdefabc | tr 'ac' 'xz'

これが機能するには、両方のセットに同じ数の文字が必要です。そうでない場合、予測可能ですが、おそらく望ましくない動作が発生します。

echo 'call me Ishmael.' | tr 'abcdjklm' '123'

セット 1 の文字数はセット 2 よりも多くなっています。「d」から「m」までの文字はセット 2 に対応する文字がありません。それらは引き続き置き換えられますが、すべてセット 2 の最後の文字に置き換えられます。

場合によってはこれが役立つ可能性もありますが、これを防ぐには-t(切り捨て) オプションを使用できます。これは、セット 1 に含まれていてセット 2 に一致する文字がある場合にのみ、それらの文字を置き換えます。

echo 'call me Ishmael.' | tr -t 'abcdjklm' '123'

範囲とトークンの使用

セット 1 とセット 2 は文字範囲を含むことができます。たとえば、[a-z]はすべての小文字を表し、[A-Z]はすべての文字を表します。これを使用して、テキスト ストリームのケースを変更できます。

これにより、入力ストリームがすべて大文字に変換されます。

echo "How-To Geek" | tr '[a-z]' '[A-Z]'

ケースを反対方向に反転させるには、同じコマンドを使用しますが、コマンドラインで大小文字の範囲を入れ替えます。

echo "How-To Geek" | tr '[A-Z]' '[a-z]'

一致させたい一般的なケースのいくつかには使用できるトークンがあります。

  • [:alnum:]: 文字と数字。
  • [:alpha:]: 文字のみ。
  • [:digit:]: 数字のみ。
  • [:blank:]: タブとスペース。
  • [:space:]: 改行文字を含むすべての空白。
  • [:graph:]: 記号を含むすべての文字(スペースは除く)。
  • [:print:]: 記号を含むすべての文字(スペースを含む)。
  • [:punct:]: すべての句読点。
  • [:lower:]: 小文字。
  • [:upper:]: 大文字。

トークンを使用して、小文字から大文字への変換と、大文字から小文字への変換を簡単に実行できます。

echo "How-To Geek" | tr '[:lower:]' '[:upper:]'

echo "How-To Geek" | tr '[:upper:]' '[:lower:]'

マッチの反転

-c(補完) オプションは、最初のセット以外のすべての文字に一致します。このコマンドは「c」以外のすべてをハイフン「-」に変換します。

echo abcdefc | tr -c 'c' '-'

このコマンドは、最初のセットに文字「a」を追加します。「a」または「c」以外のものはすべてハイフン「-」文字に変換されます。

echo abcdefc | tr -c 'ac' '-'

文字の削除と圧縮

trを使用して、置換せずに文字を完全に削除できます。

このコマンドは-d(削除) オプションを使用して、入力ストリームから「a」、「d」、または「f」の出現をすべて削除します。

echo abcdefc | tr -d 'adf'

これは、コマンドラインに 2 つではなく 1 つの文字セットしかない場合の 1 つの例です。

もう 1 つの例は、-s(繰り返しを圧縮) オプションを使用する場合です。このオプションは、繰り返される文字を 1 文字に減らします。

この例では、空白文字の繰り返しシーケンスを 1 つの空白に減らします。

echo "a b c de f c" | tr -s '[:blank:]'

[:blank:]トークンが空白文字を表し、[:space:]トークンがタブと改行文字を含むすべての形式の空白を表すのは少し混乱します。

この場合、[:blank:][:space:]に置き換えても、同じ結果が得られます。

echo "a b c de f c" | tr -s '[:space:]'

文字の削除

[:blank:][:space:]の違いは、文字を削除すると明らかになります。これを行うには、-d(削除) オプションを使用し、trが入力ストリームで検索する文字のセットを提供します。見つかったものはすべて削除されます。

echo "a b c de f c" | tr -d '[:blank:]'

スペースが削除されます。ターミナル ウィンドウに入力ストリームが書き込まれた後に改行が表示されることに注意してください。そのコマンドを繰り返し、空白の代わりに[:space:]を使用すると、異なる結果が得られます。

echo "a b c de f c" | tr -d '[:blank:]'

今回は出力の後に新しい行を開始せず、コマンド プロンプトがすぐ隣に配置されます。これは、[:space:]に改行が含まれているためです。入力ストリームからすべてのスペース、タブ、改行文字が削除されます。

もちろん、実際のスペース文字を使用することもできます。

echo "a b c de f c" | tr -d ' '

数字も簡単に削除できます。

echo abcd123efg | tr -d '[:digit:]'

-c(補完) オプションと-d(削除) オプションを組み合わせることで、数字以外のすべてを削除できます。

echo abcd123efg | tr -cd '[:digit:]'

数字以外のすべてとは、すべての文字とすべての空白を意味することに注意してください。そのため、もう一度、終了の改行が失われます。

行の結合と分割

スペースの代わりに改行文字を置換すると、テキストの行を分割し、各単語を独自の行に配置できます。

echo 'one two three four' | tr ' ' '\n'

単語を区切る区切り文字も変更できます。このコマンドは、スペースの代わりにコロン「:」を置換します。

echo 'one two three four' | tr ' ' ':'

使用されている区切り文字を検索し、それを改行文字に置き換えて、読み取りにくいテキストを管理しやすい出力に分割できます。

パス環境変数は、多くのディレクトリ パスが連なった長い文字列です。各パスはコロン「:」で区切られています。それらを改行文字に変更します。

echo $PATH

echo $PATH | tr ":" "\n"

視覚的に解析するのがはるかに簡単です。

1 行に再フォーマットする出力が得られた場合は、それを行うこともできます。ファイル「lines.txt」にはテキストが含まれており、各行に 1 つの単語があります。それをtrにフィードして、1 行に変換します。

cat files.txt

cat lines.txt | tr '\n' ' '

パイプを使用した tr の使用

trからの出力を、別のプログラムの入力として、またはtr自体に使用できます。

このコマンドはtrを 4 回使用します。

  • 最初のtrは入力からハイフン「-」をすべて削除します。
  • 2 番目のtrは、繰り返されるスペースをすべて 1 つのスペースに圧縮します。
  • 3 番目のtrは、スペースを下線「_」文字で置き換えます。
  • 4 番目で最後のtrは、文字列を小文字に変換します。

echo "Mangled FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:upper:]' '[:lower:]'

シンプルはシンプルに行う

trコマンドは、シンプルなので優れています。学ぶことも覚えることもあまりありません。しかし、そのシンプルさが仇になることもあります。

間違いなく、sedなどのより複雑なツールに手を伸ばすことなく、trで必要なことができることがよくあります。

しかし、trで何かをしようとして苦労しており、コマンドの長いデイジー チェーンを構築していることに気付いた場合は、おそらくsedを使用する必要があります。