Eu tenho o seguinte foo.txt
arquivo:
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 middle
e 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 -o
isso 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=always
opçã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.