Wie gebe ich ein Muster für eine neue Zeile in grep? Neue Zeile am Anfang, neue Zeile am Ende. Nicht der Weg des regulären Ausdrucks. So etwas wie \ n.
$. Es ist etwas begrenzt, aber in einfachen Fällen verwendbar.
Wie gebe ich ein Muster für eine neue Zeile in grep? Neue Zeile am Anfang, neue Zeile am Ende. Nicht der Weg des regulären Ausdrucks. So etwas wie \ n.
$. Es ist etwas begrenzt, aber in einfachen Fällen verwendbar.
Antworten:
grep Muster werden mit einzelnen Zeilen abgeglichen, sodass ein Muster nicht mit einer in der Eingabe gefundenen neuen Zeile übereinstimmen kann.
Sie können jedoch Leerzeilen wie diese finden:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
versuchen Sie pcregrepstatt regelmäßig grep:
pcregrep -M "pattern1.*\n.*pattern2" filename
Mit dieser -MOption kann die Übereinstimmung über mehrere Zeilen hinweg erfolgen, sodass Sie nach Zeilenumbrüchen als suchen können \n.
Sie können diesen Weg benutzen ...
grep -P '^\s$' file
-Pwird für reguläre Perl-Ausdrücke verwendet (eine Erweiterung von POSIX grep).\sPassen Sie die Leerzeichen an. Wenn gefolgt von *, stimmt es auch mit einer leeren Zeile überein.^stimmt mit dem Zeilenanfang überein. $stimmt mit dem Zeilenende überein. -Pist eine GNU-Erweiterung. Ich kann es gut verwenden, wenn es die Situation erfordert (normalerweise lookahead / lookbehind), aber POSIX grep kann dies nur mit einer Datei tun [[:space:]].
-P. GNU ist sowieso Standard. :)
brew install grepGNU grep bekommen wollen , das in mehrfacher Hinsicht überlegen ist. apple.stackexchange.com/questions/193288/…
Dank @jarno kenne ich die Option -z und habe herausgefunden, dass bei Verwendung von GNU grep mit der Option -P eine Übereinstimmung \nmit möglich ist . :) :)
Beispiel:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Druckt bar
Für die Problemumgehung (ohne Verwendung eines nicht tragbaren -PZeichens) können Sie ein neues Zeilenzeichen vorübergehend durch ein anderes ersetzen und es wieder ändern, z.
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
Grundsätzlich sucht es nach exakter Übereinstimmung, _foo_wo _bedeutet \n(so __= \n\n). Sie müssen es nicht zurück übersetzen tr '_' '\n', da jedes Muster ohnehin in der neuen Zeile gedruckt _wird. Das Entfernen ist also ausreichend.
<(p paste -sd_ file )?
gerade gefunden
grep $'\r'
Es wird $'\r'für die Flucht im C-Stil in Bash verwendet.
new line at the beginningist eine leere Zeile undnew line at endgilt für jede Zeile in der Datei. Können Sie ein Beispiel posten?