Ich habe die folgende foo.txt
Datei:
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 middle
und 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 -o
macht 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=always
Option. 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.