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

9

Por que o grep adiciona o código ANSI \e[K à sua saída colorida? Eu não consigo ver o sentido disso, mas obviamente os desenvolvedores podem. É um código do Terminal ANSI / VT100 que é usado para "Limpar linha da posição atual do cursor ao fim da linha ".

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

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

O simples echo exibe: cb , mas a exibição colorizada mostra: c

O texto codificado subjacente é: echo -e 'ab\r3[01;31m3[Kc3[m3[K' No entanto, sem os códigos \e[K , echo -e 'ab\r3[01;31mc3[m' funciona como esperado!

Qual é a razão para a inclusão do grep destes códigos \e[K ? Estou escrevendo um script para permitir a sobreposição de um segundo passo de colorização , como em: c=--color=always; ls $c /bin/gzip | grep $c 'z' . então eu preciso entender porque o grep usa \e[K .

    
por Peter.O 10.08.2012 / 07:15

1 resposta

11

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

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

Na página grep man:

          ne     Boolean  value  that prevents clearing to the end of line
                 using Erase in Line (EL) to Right  ([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).

Em primeiro lugar, é feito para definir o fundo do restante da linha para a cor correta, caso ela tenha sido alterada anteriormente (embora, por padrão, não seja; alguém pode configurá-lo para fazer isso em seu próprio configurações).

Você também pode querer jogar com as outras opções que podem ser definidas em GREP_COLORS ; veja a man page para detalhes completos.

    
por 10.08.2012 / 08:35