grep --color добавляет код ANSI ESC [K - это может изменить отображаемый текст

9

Почему 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[Kкодов в grep? Я пишу сценарий , чтобы для перекладки из второго окрашивающего прохода , как в: c=--color=always; ls $c /bin/gzip | grep $c 'z'. поэтому мне нужно понять, почему использует grep \e[K.

Peter.O
источник

Ответы:

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; см. справочную страницу для полной информации.

Майкл Хэмптон
источник