Linux tr コマンドの使用方法

公開: 2023-05-17
ラップトップ上の Ubuntu Linux 起動画面
ジョーダン・グローア / ハウツーオタク
tr コマンドはテキストのストリームに対して変換を実行し、出力として新しいストリームを生成します。 コマンドラインで設定したルールに従って、文字を置換、削除、または変換できます。

Linux でテキストのストリームを操作する簡単な方法が必要ですか? tr コマンド以外に探す必要はありません。入力テキストの置換、削除、結合、圧縮にかかる時間を節約できます。 このようにして行われます。

目次

trコマンドとは何ですか?
文字の置換
範囲とトークンの使用
一致を反転する
文字の削除と圧縮
文字を削除する
線の結合と分割
パイプでの 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 つは、プログラムが他のプログラムへの入力として使用できる出力を生成する必要があるということでした。 あるプログラムからの出力ストリームを次のプログラムへの入力ストリームとして使用して、コマンド ライン ユーティリティをデイジーチェーン接続する機能は非常に強力です。

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

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

文字の置換

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

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

これがどのように機能するかというと、セット 1 の最初の文字がセット 2 の最初の文字に置き換えられます。 セット 1 の 2 番目の文字はセット 2 の 2 番目の文字に置き換えられ、以下同様に続きます。

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

echo使用してテキストをtrにプッシュしています。

 エコー abcdefabc | tr 'c' 'z' 

単一の文字を tr に置き換える

すべての「c」が「z」に置き換えられ、新しい文字列が端末ウィンドウに書き込まれます。

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

 エコー abcdefabc | tr 'ac' 'xz' 

trで2文字を削除

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

 「イシュマエルと呼んでください」とエコーします。 | tr 'abcdjklm' '123' 

tr で不均衡な文字セットを使用する

セット 1 にはセット 2 よりも多くのキャラクターがいます。 文字「d」から「m」には、セット 2 には対応する文字がありません。 これらは引き続き置き換えられますが、すべてセット 2 の最後の文字に置き換えられます。

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

 「イシュマエルと呼んでください」とエコーします。 | tr -t 'abcdjklm' '123' 

truncate オプションを指定した tr で不均衡な文字セットを使用する

範囲とトークンの使用

セット 1 とセット 2 には、一定範囲の文字を含めることができます。 たとえば、 [az]はすべての小文字を表し、 [AZ]はすべての大文字を表します。 これを利用して、テキスト ストリームの大文字と小文字を変更できます。

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

 エコー「ハウツーオタク」 | tr '[az]' '[AZ]' 

文字範囲を使用して文字列を大文字に変換する

大文字と小文字を逆にするには、同じコマンドを使用しますが、コマンド ラインで大文字と小文字の範囲を入れ替えます。

 エコー「ハウツーオタク」 | tr '[AZ]' '[az]' 

文字範囲を使用して文字列を小文字に変換する

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

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

トークンを使用すると、小文字から大文字への変換、および大文字から小文字への変換も同様に簡単に実行できます。

 エコー「ハウツーオタク」 | tr '[:下位:]' '[:上:]'
 エコー「ハウツーオタク」 | tr '[:upper:]' '[: lower:]' 

トークンを使用してテキスト文字列の大文字と小文字を変更する

一致を反転する

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

 エコー abcdefc | tr -c 'c' '-' 

指定した文字を除くすべての文字を他の文字に置き換える

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

 エコー abcdefc | tr -c 'ac' '-' 

指定された複数の文字を除くすべての文字を他の文字に置き換える

文字の削除と圧縮

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

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

 エコー abcdefc | tr -d 'adf' 

tr を使用してテキスト文字列から複数の文字を削除する

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

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

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

 エコー「abc de fc」 | tr -s '[:blank:]' 

tr を使用して、繰り返される文字シーケンスを単一の文字に変更する

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

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

 エコー「abc de fc」 | tr -s '[:スペース:]' 

tr を使用して、繰り返される文字シーケンスを単一の文字に変更する

文字を削除する

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

 エコー「abc de fc」 | tr -d '[:blank:]' 

tr を使用してテキスト文字列から空白 (スペース文字) を削除する

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

 エコー「abc de fc」 | tr -d '[:blank:]' 

tr を使用してテキスト文字列から空白を削除する

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

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

 エコー「abc de fc」 | tr -d ' ' 

tr を使用してスペース文字を指定して、テキスト文字列からスペースを削除する

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

 エコー abcd123efg | tr -d '[:数字:]' 

tr を使用してテキスト文字列から数字を削除する

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

 エコー abcd123efg | tr -cd '[:数字:]' 

trを使用してテキスト文字列から数字以外のすべてを削除する

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

線の結合と分割

スペースを改行文字に置き換えると、テキストの行を分割し、各単語をそれぞれの行に配置できます。

 エコー '1 2 3 4' | tr ' ' '\n' 

tr を使用して、テキスト行を 1 行につき 1 つの単語に分割する

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

 エコー '1 2 3 4' | tr ' ' :' 

tr を使用して単語の区切り文字をスペースからコロンに変更する

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

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

 エコー $PATH
 エコー $PATH | tr ":" "\n" 

tr を使用して、$PATH 環境変数を 1 行に 1 つずつ個別のディレクトリ パスに分割します。

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

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

 猫ファイル.txt
 猫のセリフ.txt | tr '\n' ' ' 

tr を使用して複数行の入力を 1 行のテキストに結合する

パイプでの tr の使用

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

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

  • 最初のtr入力からハイフン「-」を削除します。
  • 2 番目のtr繰り返されるスペースを単一のスペースに圧縮します。
  • 3 番目のtrスペースをアンダースコア「_」文字に置き換えます。
  • 4 番目と最後のtr文字列を小文字に変換します。
 echo "マングルされた FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:upper:]' '[: lower:]' 

tr の 4 つのインスタンスのパイプライン

関連: Linux でパイプを使用する方法

シンプルであることはシンプルであることを意味します

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

誤解しないでください。 tr使用すると、 sedのような複雑なツールを使用しなくても、必要なことを実行できることがよくわかります。

Linux で sed コマンドを使用する方法
関連Linux で sed コマンドを使用する方法

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