Unixでtrコマンドの「-s」、「-t」、および「-c」オプションはどのように機能しますか?


12

私は道について混乱しています-s-t-cのオプションはで仕事のtrコマンド。私がする時

echo I am a good boy | tr good bad

私は出力を取得します:

I am a bddd bdy

oで繰り返されてgoodいるため、これは非常に理解できます。の最後の可能な変更odであり、したがって出力です。

今私がするとき

echo I am a good boy | tr -s good bad

出力は

I am a bd bdy

この-sオプションは、セット1の各文字が繰り返されるたびに1つに絞り込み、セット1の各文字を同じ位置にあるセット2の対応する文字に変更することになっています。

だからそれはあったはずです

I am a bad bay.

なぜ変更したのですか?

さらに、私がするとき

echo I am a good boy | tr -c good bad

私は得る dddddddgoodddodd

この例を参照する-ctr、オプションはでどのように機能しますか?

そして最後に:自分をいい子から悪い子に変える方法.... :):Pつまり、

echo I am a good boy | tr <something>出力は次のようになりますI am a bad boy

回答:


12

-s スイッチ:スクイーズ(繰り返される文字を削除)

echo i am a good boy | tr -s good bad

出力: i am a bd bdy

これを実現する裏側で起こっていることが2つあります。最初に、2番目の引数がtr最初の引数よりも短い場合、2番目の引数の最後の文字が繰り返され、最初の引数と同じ長さになります。したがって、同等のコマンドは次のとおりです。

echo i am a good boy | tr -s good badd

もう1つ発生しているのは、最初の引数の文字が繰り返されると、以前の文字が上書きされることです(私はの2つooのを参照していgoodます)。これにより、コマンドは次のようになります。

echo i am a good boy | tr -s god bdd

(置換の2番目はod置換の前のものoを上書きし、それをa冗長にします)

-sスイッチがない場合、出力は

i am a bddd bdy

-sスイッチを使用するtrと、最後の引数にリストされているすべての繰り返される文字が最終的に出力されます。

i am a bd bdy

-c スイッチ:補数

-cスイッチは、最初の引数(引数1に記載されていないつまり、すべての文字)の補数を一致させるために使用されます。その結果、arg 1には多くの文字(256-3)が含まれます。さて、前の場合と同じことがarg 2にも起こります。Arg2の最後の文字が繰り返されて、長さまたはArg 1に一致します。したがって、元のステートメントは次のようになります。

echo i am a good boy | tr -c good bad

以下と同等です。

echo i am a good boy | tr abcefhijklmnp... baddddddddddd...

(欠落していることに注意してくださいgoそしてd最初のセットでは、それdが2番目のセットの他のすべての文字を置き換えることに注意してください-スペース文字を含みます)

これが理由であるi am a good boyに変身dddddddgoodddodd

詳細はこちら:http : //www.linuxjournal.com/article/2563


入力で繰り返される最後の引数から(最初の引数ではなく)までの任意の文字を-sスイッチがtr圧縮することを除いて、通常は正しい。これはリンクした記事に記載されており、manページの「説明」セクションの最後の段落で説明されていますtr
ravron

4

の理解-sは正しくありません。入力内のセット1で繰り返される文字を単一の文字に置き換えます。たとえば、セットは変更されません。

echo i am a good boy | tr -s god bad

与える

i am a bad bay

この-cオプションは、セット1をその補集合(つまり、セット1に含まれていないすべての文字のセット)で置き換えます。これを使用して、たとえば指定した文字以外をすべて削除できます。

echo i am a good boy | tr -cd gobdy

出力

goodboy

:-sオプションに関してあなたの要点を得たが、私の質問は、どのように:echo私はいい子だ| tr -s good badは次のように出力します:i am a bd bdyこれは、これが発生した場合にのみ可能です:最初に私はa good a boyがi am a bddd bdyに変更され、次に-sオプションが複数のdの出現を単一に変更しますすなわち、私はbddd bdyであり、次にa bd bdyに変更されます。これは実際に何が起こっているのですか?-cオプションと同じように、これを分解してください。エコーは良い子です| tr -cd gobdyがこれを与える:goodboy

1

他のカバーの回答tr-s-t、および-cオプションが、完全性のために:

あなたが間違った道具を拾ったのであなたは問題を抱えています。

  • tr 文字変換用です
  • sed ストリーム編集用です。

両方以来goodとはbad、ストリーム内の文字列ですsed良く一致しています。

echo I am a good boy | <something> 出力は次のようになります: I am a bad boy

$ echo I am a good boy | sed s/good/bad/g
I am a bad boy

s/..../..../代替です。最初の正規表現に一致するものはすべて、2番目の正規表現に置き換えられます。/g最後のフラグはこのようにグローバル置換用であり、最初のオカレンスだけでなくすべてのオカレンスが置換されます。

$ echo I am a good boy and a good boy is me. | sed s/good/bad/
I am a bad boy and a good boy is me.

$ echo I am a good boy and a good boy is me. | sed s/good/bad/g
I am a bad boy and a bad boy is me.

0

はい。丁度!

tr -s 繰り返される文字のインスタンスを単一の文字に置き換えます。

(manページ経由)

したがって、次のようになります。

に変換さgoodbdddます。繰り返されるインスタンスは3 'd'です。

したがって、これらの3つのインスタンスを単一のインスタンスに置き換えます。

つまり、それはそれをbdにします。:)


2
すべての回答が完璧であるとは限りませんが、正しいつづり、句読点、文法の回答は読みやすくなります。
Ashildr 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.