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 pcregrep
statt regelmäßig grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
Mit dieser -M
Option 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
-P
wird für reguläre Perl-Ausdrücke verwendet (eine Erweiterung von POSIX grep
).\s
Passen 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. -P
ist 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 grep
GNU 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 \n
mit möglich ist . :) :)
Beispiel:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Druckt bar
Für die Problemumgehung (ohne Verwendung eines nicht tragbaren -P
Zeichens) 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 beginning
ist eine leere Zeile undnew line at end
gilt für jede Zeile in der Datei. Können Sie ein Beispiel posten?