修正する:

修正する:

あるコマンドの出力をgrep別のコマンドにパイプしていますgrep。最初の一致に色が割り当てられるように、最初の項目がgrep使用されます。--color=always実際には、2つのカラーコード(たとえば、\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 --colorman 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

目標が「一致する合計文字を含み、強調表示するすべてのA行を表示すること」である場合、最も簡単な解決策はegrepを使用して強調表示を再追加して、すべての一致後にすべての強調表示を実行するようです。それは次のとおりです。mAm

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

答え3

実際のユースケースは何ですか?A含まれているすべての行でカラーコードを使用するには、sを逆にするだけmです。grep

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

または、生の出力でテキストを見つける場合は、以前のmカラーコードをすべて除外しgrep mますが、結果を印刷する必要があります。そしてカラーコード。これを行う1つの方法は、nl出力行に番号付けを使用し、次の行番号に対応する出力の行番号のみを保存し、出力の行にgrep印刷専用カラーコードを使用することです。msed -n

関連情報