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

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

为什么 grep 将 ANSI 代码添加\e[K到其彩色输出中?我看不出它的意义,但显然开发人员可以。它是一个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'也可以按预期工作!

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

答案1

您可以通过设置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;有关完整详细信息,请参阅手册页。

相关内容