Warum liefert das Greppen mit Farbe nichts zurück?

Warum liefert das Greppen mit Farbe nichts zurück?

Ich habe die folgende foo.txtDatei:

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

Und ich versuche, die Mittelzeile nur nach dem Wort zu greifen middleund die Umgebung zurückzugeben (als Beispiel), sodass ich den ganzen Satz hervorheben kann (was besonders nützlich ist, wenn ich die Kontextoption verwende).

EstutArbeit ohne Farbe:

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

Aber der gleiche Befehlnichtmit Farbe arbeiten:

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

Hinweis: Ohne -omacht es keinen Unterschied.

Es funktioniert jedoch, wenn nur die erste Hälfte der Zeile gefiltert wird:

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

aber nicht mit der zweiten Hälfte ( 'middle .\+').

Warum funktioniert das nicht wie erwartet und wie kann ich es beheben? Ist das ein Fehler oder kann ich aus irgendeinem Grund nicht zwei Regex-Ausdrücke gleichzeitig verwenden?


Getestet auf OS X mit:

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

Obwohl es unter Linux zu funktionieren scheint, bin ich verwirrt.

Antwort1

Wenn Sie grep mit Farboptionen verwenden, erzeugt es zusätzliche Escape-Zeichenfolgen, die dem Terminal mitteilen, die Farbe ein- oder auszuschalten. Diese Folgen bergen das Risiko, dass sie nicht richtig interpretiert werden und unerwartete Ergebnisse verursachen.
Sie können diese anzeigen, indem Sie die Ausgabe von grep erfassen.

Ohne Farbe

sende greps-Ausgabe anoutput.txt

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

Mit Farbe

Erzwingen der Farbe mit der --color=alwaysOption. Wenn Sie die Greps-Ausgabe umleiten, wird die Farbe – wenn möglich – aus genau dem von Ihnen hervorgehobenen Grund ausgeschaltet. Die Escape-Zeichen können Nebenwirkungen erzeugen.

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

Möglicherweise verursachen diese Escape-Sequenzen das Problem.

verwandte Informationen