grep --color adiciona o código ANSI ESC [K - Isso pode alterar o texto exibido

9

Por que o grep adiciona código ANSI \e[Kà sua saída colorida? Não consigo entender o motivo, mas obviamente os desenvolvedores podem. É um código de terminal ANSI / VT100 usado para "Limpar a linha da posição atual do cursor até o final da linha" .

Em um caso de franja, o grep pode fazer com que o texto desapareça da tela do terminal. Por exemplo:

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

O eco simples exibe :,cb mas a tela colorida mostra:c

O texto codificado subjacente é: echo -e 'ab\r\033[01;31m\033[Kc\033[m\033[K' No entanto, sem os \e[Kcódigos, echo -e 'ab\r\033[01;31mc\033[m'funciona conforme o esperado!

Qual é o motivo da inclusão desses \e[Kcódigos pelo grep . Eu estou escrevendo um script para permitir a sobreposição de uma segunda passagem colorizing , como em: c=--color=always; ls $c /bin/gzip | grep $c 'z'. então eu preciso entender por que o grep usa \e[K.

Peter.O
fonte

Respostas:

11

Você pode alterar esse comportamento definindo a GREP_COLORSvariável de ambiente:

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

Na greppágina do manual:

          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).

Isso é feito em primeiro lugar para definir o plano de fundo do restante da linha para a cor correta, caso tenha sido alterado anteriormente (embora por padrão não seja; alguém pode configurá-lo para fazê-lo em suas próprias configurações).

Você também pode querer jogar com as outras opções que podem ser definidas GREP_COLORS; consulte a página do manual para obter detalhes completos.

Michael Hampton
fonte