我正在将一个命令的输出传输grep
到另一个命令中grep
。第一个grep
是使用--color=always
,以便第一个匹配项是彩色的。实际上,这意味着匹配包含在两个颜色代码之间,即\033[1;31m
和\033[0m
。
现在的问题是,如果第二个模式是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
和 not 的原因--color=always
。
如果您的目标是“显示包含A
和m
并突出显示匹配A
和m
字符的所有行”,那么最简单的解决方案似乎是在所有匹配之后进行所有突出显示,使用一个egrep 将突出显示重新添加回来。就像是:
{
echo "A b";
echo "A m";
echo "B m";
echo "Another m";
} | grep 'A' | grep 'm' | egrep --color 'A|m';
答案3
实际用例是什么?如果你想A
在所有包含的行中使用颜色代码m
,你可以简单地反转grep
s:
echo A B C | grep m | grep --color=always A
或者,如果您要在原始输出中查找文字,m
则需要排除之前的所有颜色代码grep m
,但打印结果和颜色代码。执行此操作的一种方法是使用nl
对输出的行进行编号,grep
对于后跟 的行号m
,仅保存该输出中的行号,然后使用sed -n
仅打印颜色编码输出中的行。