Wie kann ich für ein mehrzeiliges Muster in einer Datei suchen?
-
02-07-2019 - |
Frage
Ich brauchte alle Dateien zu finden, die eine bestimmte Zeichenfolge Muster enthalten. Die erste Lösung, die den Sinn kommt, ist mit finden verrohrt mit xargs grep :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
Aber wenn ich brauche Muster zu finden, das auf mehr als eine Zeile umfasst, ich bin stecken, weil Vanille grep nicht mehrzeiliges Muster finden kann.
Lösung
So entdeckte ich pcregrep das steht für Perl Compatible Regular Expressions GREP .
Zum Beispiel müssen Sie die Dateien finden, wo die ' _name ' Variable immediatelly gefolgt von der ' _description ' Variable:
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
Tipp: Sie müssen den Zeilenumbruch Zeichen in Ihrem Muster aufzunehmen. Je nach Plattform, könnte es '\ n', \ r‘, '\ r \ n', ...
seinAndere Tipps
Warum gehst du nicht für awk :
awk '/Start pattern/,/End pattern/' filename
grep -P
auch verwendet libpcre, ist aber viel breiter installiert. Um einen vollständigen title
Abschnitt eines HTML-Dokument zu finden, auch wenn es mehr Zeilen umfasst, können Sie diese verwenden:
grep -P '(?s)<title>.*</title>' example.html
Da der PCRE Projekt zum Perl-Standard implementiert, verwenden Sie die Perl-Dokumentation als Referenz:
Hier ist ein gutes Beispiel:
pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html
Es sucht in dem Titel-Tag in einer HTML-Datei, auch wenn es bis zu 5 Zeilen erstreckt.
Hier ist ein Beispiel für unbegrenzte Zeilen:
pcregrep -Mi "(?s)<title>.*</title>" example.html
Mit Silber Sucher :
ag 'abc.*(\n|.)*efg'
Geschwindigkeitsoptimierungen Silber Sucher könnten hier glänzen.
Sie können die grep Alternative verwenden Sift hier (Disclaimer: Ich bin der Autor).
Es mehrzeilige Anpassung unterstützen und die Suche auf bestimmte Dateitypen aus der Box zu beschränken:
sift -m --files '*.py' 'YOUR_PATTERN'
(Suche auch * .py Dateien für den angegebenen mehrzeilige RegexMuster)
Es ist für alle gängigen Betriebssysteme zur Verfügung. Werfen Sie einen Blick auf dem Proben , um zu sehen, wie es verwendet werden kann, um mehrzeilige Werte von einem zu extrahieren XML-Datei.
Diese Antwort könnte nützlich sein:
Regex (grep) für mehrzeilige Suche erforderlich
Um rekursiv können Sie Flags verwenden -R (rekursiv) und --include (GLOB Muster). Siehe auch:
durch bestimmte Dateien grepperl -ne 'print if (/begin pattern/../end pattern/)' filename
Mit ex
/ vi
Editor und globstar Option (Syntax ähnlich wie awk
und sed
):
ex +"/string1/,/string3/p" -R -scq! file.txt
wo aaa
ist Ihr Ausgangspunkt, und bbb
ist Ihr Ende Text.
rekursiv suchen, versuchen:
ex +"/aaa/,/bbb/p" -scq! **/*.py
. Hinweis: **
Syntax, laufen shopt -s globstar
(Bash 4 oder zsh)
@Marcin: awk Beispiel nicht gierige:
awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename