更新:

更新:

我正在将一个命令的输出传输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

如果您的目标是“显示包含Am并突出显示匹配Am字符的所有行”,那么最简单的解决方案似乎是在所有匹配之后进行所有突出显示,使用一个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,但打印结果颜色代码。执行此操作的一种方法是使用nl对输出的行进行编号,grep对于后跟 的行号m,仅保存该输出中的行号,然后使用sed -n仅打印颜色编码输出中的行。

相关内容