Por que usar cores não retorna nada?

Por que usar cores não retorna nada?

Eu tenho o seguinte foo.txtarquivo:

This is the first line.
This is the middle line.
This is the last line.

E estou tentando usar o grep na linha do meio apenas pela palavra middlee retornar o entorno (como exemplo), para poder destacar a frase inteira (o que é especialmente útil ao usar a opção com contexto).

Istofaztrabalhar sem a cor:

$ grep -o --color=none '.\+ middle .\+' foo.txt
This is the middle line.

Mas o mesmo comandonãotrabalhar com cores:

$ grep -o --color=auto '.\+ middle .\+' foo.txt
(empty line)

Obs: Sem -oisso não faz diferença.

Embora funcione ao filtrar apenas a primeira metade da linha:

$ grep -o --color=auto '.\+ middle' foo.txt
This is the middle

mas não com o segundo tempo ( 'middle .\+').

Por que isso não funciona conforme o esperado e como posso corrigir isso? É um bug ou não consigo usar duas expressões regex ao mesmo tempo por algum motivo?


Testado no OS X com:

$ grep --version
grep (BSD grep) 2.5.1-FreeBSD

Embora pareça funcionar no Linux, estou confuso.

Responder1

Quando você usa grep com opções de cores, ele produz sequências extras de caracteres de escape que informam ao terminal para ativar ou desativar a cor. Essas sequências apresentam o risco de não serem interpretadas corretamente e causarem resultados inesperados.
Você pode visualizá-los capturando a saída do grep

Sem cor

enviar saída do greps paraoutput.txt

% grep -o --color=none '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt 
This is the middle line.$

Com cor

Forçando a cor com a --color=alwaysopção. Se você redirecionar a saída do greps, ela - se possível - desativará a cor pelo motivo exato que você destacou, os caracteres de escape podem produzir efeitos colaterais.

% grep -o --color=always '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt                                             
^[[01;31m^[[KThis is the middle line.^[[m^[[K$

É possível que essas sequências de escape estejam causando o problema.

informação relacionada