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.

War es hilfreich?

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', ...

sein

Andere Tipps

Warum gehst du nicht für awk :

awk '/Start pattern/,/End pattern/' filename

Hier ist das Beispiel mit GNU grep :

grep -Pzo '_name.*\n.*_description'
  

-z / --null-data Treat Eingangs- und Ausgangsdaten als Sequenzen von Linien.

Siehe auch hier

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:

Verwendung grep --exclude / - umfassen Syntax nicht

durch bestimmte Dateien grep
perl -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)

So aktivieren

@Marcin: awk Beispiel nicht gierige:

awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top