アップデート:

アップデート:

grepあるコマンドの出力を別のコマンドにパイプしていますgrep。最初はgrepを使用しているため、最初の一致が色付きになります。実際には、一致が 2 つの色コード、つまりと--color=alwaysで囲まれていることを意味します。\033[1;31m\033[0m

ここで問題となるのは、2 番目のパターンが の場合m、前の一致のカラー コードと一致することです。

echo A B C | grep --color=always A | grep m

同様に、番号31も一致します。

これを回避する方法はありますか?

アップデート:

言うまでもなく、マッチには色を付ける必要があるだろうと予想していたので、取り除くことは--color=always私にとって満足のいく解決策ではありません。

答え1

を使用しないでくださいgrep --color=always。これがまさに、GNU grep(およびおそらく他のツール) に も用意されている理由です。grep --color=autoは、 のみと同等ですgrep --color( よりman grep)。

   --color[=WHEN], --colour[=WHEN]
          Surround  the  matched  (non-empty)  strings,  matching   lines,
          context  lines,  file  names,  line  numbers,  byte offsets, and
          separators (for fields and groups of context lines) with  escape
          sequences  to display them in color on the terminal.  The colors
          are  defined  by  the  environment  variable  GREP_COLORS.   The
          deprecated  environment  variable GREP_COLOR is still supported,
          but its setting does not have priority.  WHEN is never,  always,
          or auto.

これについてより詳細に文書化されている場所を見つけることができませんが、基本的には出力がgrepファイルか端末かパイプかなどを検出し、それに応じて動作します。

$ echo foo | grep --color=always o | grep m
f[01;31mo[m[01;31mo[m
$ echo foo | grep --color=always o >outfile; grep m outfile
f[01;31mo[m[01;31mo[m

上記を以下と比較

$ echo foo | grep --color o >outfile; grep m outfile
$ echo foo | grep --color o | grep m 
$ 

したがって、このautoオプションを使用すると、基本的に、色が見えるときだけ色が印刷されます。これは非常に巧妙で、魔法のように機能します。そのため、私は次のものを持っています。

$ type grep
grep is aliased to `grep --color'

答え2

ちなみに、これがまさに、 が ではなく を--colorデフォルトで設定する理由です。--color=auto--color=always

目標が「との両方を含むすべての行を表示しAm一致するAm文字を強調表示する」である場合、最も簡単な解決策は、すべての一致の後にすべての強調表示を実行し、1 つの egrep を使用して強調表示を戻すことです。次のようになります。

{
    echo "A b";
    echo "A m";
    echo "B m";
    echo "Another m";
} | grep 'A' | grep 'm' | egrep --color 'A|m';

答え3

A実際の使用例は何ですか?を含むすべての行に色分けしたい場合は、m単にgreps を逆にします。

echo A B C | grep m | grep --color=always A

あるいは、元の出力でリテラルを探している場合は、すべての色コードを除外して結果を印刷するm必要があります。grep m色分けされた出力。これを行う 1 つの方法は、 を使用してnl出力の行に番号を付け、grep行番号の後に が続く場合はm、その出力から行番号のみを保存し、 を使用してsed -n色分けされた出力の行のみを印刷することです。

関連情報