¿Por qué buscar color no devuelve nada?

¿Por qué buscar color no devuelve nada?

Tengo el siguiente foo.txtarchivo:

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

Y estoy tratando de agarrar la línea media solo por la palabra middley devolver los alrededores (como ejemplo), para poder resaltar la oración completa (lo cual es especialmente útil cuando se usa con la opción de contexto).

Élhacetrabajar sin el color:

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

Pero el mismo comandonotrabajar con color:

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

Nota: Sin -oél no hay ninguna diferencia.

Aunque funciona al filtrar solo la primera mitad de la línea:

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

pero no con la segunda mitad ( 'middle .\+').

¿Por qué esto no funciona como se esperaba y cómo puedo solucionarlo? ¿Es un error o no puedo usar dos expresiones regulares al mismo tiempo por algún motivo?


Probado en OS X con:

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

Aunque parece funcionar en Linux, estoy confundido.

Respuesta1

Cuando usa grep con opciones de color, produce secuencias de caracteres de escape adicionales que le indican al terminal que active o desactive el color; estas secuencias introducen el riesgo de no interpretarse correctamente y provocar resultados inesperados.
Puede verlos capturando la salida de grep

sin color

enviar salida greps aoutput.txt

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

con color

Forzando el color con la --color=alwaysopción. Si redirige la salida de greps, si es posible, desactivará el color por el motivo exacto que ha resaltado; los caracteres de escape pueden producir efectos secundarios.

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

Es posible que estas secuencias de escape estén causando el problema.

información relacionada