重要なポイント
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 つは、プログラムが他のプログラムへの入力として使用できる出力を生成する必要があるということでした。あるプログラムからの出力ストリームを次のプログラムへの入力ストリームとして使用して、コマンド ライン ユーティリティをデイジーチェーン接続する機能は非常に強力です。
場合によっては、あるプログラムからの出力が次のプログラムに到達する前に微調整したり微調整したりすることが必要になる場合があります。あるいは、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'
すべての「c」が「z」に置き換えられ、新しい文字列が端末ウィンドウに書き込まれます。
今回は「a」と「c」の 2 つの文字を検索します。 「ac」を検索しているわけではないことに注意してください。 「a」を探してから、「c」を探します。 「a」が出現する場合は「x」に置き換えられ、「c」が出現する場合は「z」に置き換えられます。
エコー abcdefabc | tr 'ac' 'xz'
これが機能するには、両方のセットに同じ数の文字が含まれている必要があります。そうしないと、予測可能ではあるものの、おそらく望ましくない動作が発生することになります。
「イシュマエルと呼んでください」とエコーします。 | tr 'abcdjklm' '123'
セット 1 にはセット 2 よりも多くのキャラクターがいます。文字「d」から「m」には、セット 2 には対応する文字がありません。これらは引き続き置き換えられますが、すべてセット 2 の最後の文字に置き換えられます。
場合によってはこれが役立つ可能性もありますが、これを防ぎたい場合は、
-t
(切り捨て) オプションを使用できます。これは、セット 2 に一致する文字を持つセット 1 に含まれる文字のみを置き換えます。
「イシュマエルと呼んでください」とエコーします。 | tr -t 'abcdjklm' '123'
範囲とトークンの使用
セット 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'
これは、コマンド ラインに 2 つの文字セットではなく 1 つの文字セットしかない場合の 1 つの例です。
もう 1 つは、
-s
(squeeze-repeats) オプションを使用する場合です。このオプションは、繰り返される文字を 1 つの文字に減らします。
この例では、スペース文字の繰り返しシーケンスを 1 つのスペースに減らします。
エコー「abc de fc」 | tr -s '[:blank:]'
[:blank:]
トークンはスペース文字を表し、
[:space:]
トークンはタブや改行文字を含むすべての形式の空白を表すため、少し混乱します。
この場合、
[:blank:]
を
[:space:]
に置き換えても同じ結果が得られます。
エコー「abc de fc」 | tr -s '[:スペース:]'
文字を削除する
[:blank:]
と
[:space:]
の違いは、文字を削除すると明らかになります。これを行うには、
-d
(削除) オプションを使用し、
tr
が入力ストリームで検索する文字のセットを提供します。見つかったものはすべて削除されます。
エコー「abc de fc」 | tr -d '[:blank:]'
スペースが削除されます。出力ストリームがターミナル ウィンドウに書き込まれた後に改行が表示されることに注意してください。
このコマンドを繰り返し
、空白の代わりに
[:space:]
を使用すると、異なる結果が得られます。
エコー「abc de fc」 | tr -d '[:blank:]'
今回は出力の後に新しい行を開始せず、コマンド プロンプトが出力のすぐ近くに表示されます。これは、
[:space:]
に改行が含まれるためです。スペース、タブ、改行文字は入力ストリームから削除されます。
もちろん、実際のスペース文字も使用できます。
エコー「abc de fc」 | tr -d ' '
数字も簡単に削除できます。
エコーabcd123efg | tr -d '[:数字:]'
-c
(補完) オプションと
-d
(削除) オプションを組み合わせると、数字以外のすべてを削除できます。
エコー abcd123efg | tr -cd '[:数字:]'
数字以外のすべてはすべての文字とすべての空白を意味するため、ここでも終了の改行が失われることに注意してください。
線の結合と分割
スペースを改行文字に置き換えると、テキストの行を分割し、各単語をそれぞれの行に配置できます。
エコー '1 2 3 4' | tr ' ' '\n'
単語を区切る区切り文字も変更できます。このコマンドは、スペースをコロン「
:
」に置き換えます。
エコー '1 2 3 4' | tr ' ' :'
使用されている区切り文字を見つけて改行文字に置き換えることで、読みにくいテキストを管理しやすい出力に分割できます。
path 環境変数は、多くのディレクトリ パスからなる長い文字列です。各パスはコロン「
:
」で区切られます。これらを改行文字に変更します。
エコー $PATH
エコー $PATH | tr ":" "\n"
これは視覚的に解析するのがはるかに簡単です。
単一行に再フォーマットしたい出力がある場合は、それも行うことができます。ファイル「lines.txt」には、各行に 1 つの単語が含まれるテキストが含まれています。それを
tr
にフィードし、単一行に変換します。
猫ファイル.txt
猫のセリフ.txt | tr '\n' ' '
パイプでの 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
コマンドはシンプルなので優れています。学ぶことも覚えることもあまりありません。しかし、そのシンプルさが欠点になることもあります。
誤解しないでください。
tr
使用すると、
sed
などのより複雑なツールを使用しなくても、必要なことを実行できることがよくわかります。
ただし、
tr
を使用して何かを行うのに苦労していて、コマンドの長いデイジー チェーンを構築していることに気付いた場合は、おそらく
sed
を使用する
必要があります。





