あるコマンドの出力を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 --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
。
目標が「一致する合計文字を含み、強調表示するすべてのA
行を表示すること」である場合、最も簡単な解決策はegrepを使用して強調表示を再追加して、すべての一致後にすべての強調表示を実行するようです。それは次のとおりです。m
A
m
{
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
印刷専用カラーコードを使用することです。m
sed -n