
Tengo el siguiente foo.txt
archivo:
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 middle
y 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=always
opció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.