Por que grepping com cor não retorna nada?

5

Eu tenho o seguinte arquivo foo.txt :

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

E estou tentando aproximar a linha média apenas pela palavra middle e retornar o entorno (como exemplo), para que eu possa destacar toda a frase (que é especialmente útil ao usar com a opção context).

funciona sem a cor:

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

Mas o mesmo comando não funciona com cores:

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

Observação: sem -o , 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 a segunda metade ( 'middle .\+' ).

Por que isso não funciona como esperado e como posso corrigi-lo? É um bug ou não posso 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.

    
por kenorb 19.05.2016 / 01:48

1 resposta

3

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

Sem cor

envia a saída do greps para output.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 opção --color=always . Se você redirecionar a saída do greps, se possível, a cor será desativada 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.

    
por 19.05.2016 / 03:45