grep --color添加ANSI代码ESC [K-这可以更改显示的文本


9

为什么grep会\e[K在其彩色输出中添加ANSI代码?我看不出要点,但显然开发人员可以。这是ANSI / VT100终端代码,用于“从当前光标位置清除行到行尾”

在边缘情况下,grep会导致文本从终端显示中“消失”。例如:

echo -e "ab\rc"
echo -e "ab\rc" |grep --color=always "c"

简单的显显示:cb,但是彩色显示显示:c

底层的编码文本是:echo -e 'ab\r\033[01;31m\033[Kc\033[m\033[K' 但是,没有\e[K代码,则 echo -e 'ab\r\033[01;31mc\033[m'可以正常工作!

grep包含这些\e[K代码的原因是什么?我正在编写一个脚本,以允许覆盖第二遍着色,如:c=--color=always; ls $c /bin/gzip | grep $c 'z'。所以我需要理解为什么grep使用\e[K

Answers:


11

您可以通过设置GREP_COLORS环境变量来更改此行为:

export GREP_COLORS=ne
echo -e "ab\rc" | grep --color=always "c"

grep手册页:

          ne     Boolean  value  that prevents clearing to the end of line
                 using Erase in Line (EL) to Right  (\33[K)  each  time  a
                 colorized  item  ends.   This  is  needed on terminals on
                 which EL is not supported.  It  is  otherwise  useful  on
                 terminals  for  which  the back_color_erase (bce) boolean
                 terminfo capability  does  not  apply,  when  the  chosen
                 highlight colors do not affect the background, or when EL
                 is too slow or causes too much flicker.  The  default  is
                 false (i.e., the capability is omitted).

首先,是将行的其余部分的背景设置为正确的颜色,以防万一它被更早地更改(尽管默认情况下它不是;有人可能会在自己的设置中将其设置为正确的颜色)。

您可能还想使用可以在中设置的其他选项GREP_COLORS。有关完整的详细信息,请参见手册页。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.