Ich musste alle Dateien finden, die ein bestimmtes Zeichenfolgenmuster enthielten. Die erste Lösung, die mir in den Sinn kommt, ist die Verwendung von find mit xargs grep :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
Aber wenn ich Muster finden muss, die sich über mehr als eine Zeile erstrecken, stecke ich fest, weil Vanilla Grep keine mehrzeiligen Muster finden kann.
Antworten:
Also entdeckte ich pcregrep, was für Perl Compatible Regular Expressions GREP steht .
Beispielsweise müssen Sie Dateien suchen, in denen die Variable ' _name ' unmittelbar gefolgt von der Variablen ' _description ' ist:
Tipp: Sie müssen das Zeilenumbruchzeichen in Ihr Muster aufnehmen. Abhängig von Ihrer Plattform kann es sich um '\ n', \ r ',' \ r \ n ', ... handeln.
quelle
pcregrep
ist auf dem Mac verfügbar mitbrew install pcre
-H
welche den Dateinamen vor jedem Spiel druckt :pcregrep -HM
.Warum gehst du nicht für awk :
quelle
awk
bei den meisten * nix-Systemen verwendet.awk '/Start pattern/,/End pattern/ {printf NR " "; print}' filename
. Sie können es schöner machen, indem Sie den Zeilennummern eine feste Breite geben :awk '/Start pattern/,/End pattern/ {printf "%-4s ", NR; print}' filename
.Hier ist das Beispiel mit GNU
grep
:Siehe auch hier
quelle
-z
, damit die Suche nicht in eine einzelne Zeile aufgeteilt wird und-o
nur übereinstimmende Teile gedruckt werden.grep -rzl pattern *
, -rzo funktionierte nicht)brew reinstall --with-pcre git
grep -P
verwendet auch libpcre, ist aber viel weiter installiert. Um einen vollständigentitle
Abschnitt eines HTML-Dokuments zu finden, können Sie Folgendes verwenden, auch wenn es mehrere Zeilen umfasst:Da das PCRE-Projekt den Perl-Standard implementiert, verwenden Sie die Perl-Dokumentation als Referenz:
quelle
Hier ist ein nützlicheres Beispiel:
Es durchsucht das Titel-Tag in einer HTML-Datei, auch wenn es bis zu 5 Zeilen umfasst.
Hier ist ein Beispiel für unbegrenzte Zeilen:
quelle
(?s)
Ihrem regulären Ausdruck Folgendes hinzufügen :"(?s)<html>.*</html>"
$
(am Ende eines Musters) suchen, um anzuzeigen , dass es das Ende der Zeile ist - obwohl dies nicht das Gleiche ist, wie wenn Sie mehrere Zeilenmuster finden. Siehe auchglob(7)
. Sie könnten auch diese Website von Interesse finden: regulär-expressions.infoMit Silbersucher :
Geschwindigkeitsoptimierungen von Silver Searcher könnten hier möglicherweise glänzen.
quelle
Sie können hier das alternative Grep-Sift verwenden (Haftungsausschluss: Ich bin der Autor).
Es unterstützt den mehrzeiligen Abgleich und beschränkt die Suche sofort auf bestimmte Dateitypen:
(Durchsuchen Sie alle * .py-Dateien nach dem angegebenen mehrzeiligen regulären Ausdrucksmuster.)
Es ist für alle gängigen Betriebssysteme verfügbar. Werfen Sie einen Blick auf die Proben - Seite , um zu sehen , wie es verwendet werden kann , um mehrzeilige Werte aus einer XML - Datei zu extrahieren.
quelle
Diese Antwort könnte nützlich sein:
Regex (grep) für mehrzeilige Suche erforderlich
Um rekursiv zu suchen, können Sie die Flags -R (rekursiv) und --include (GLOB-Muster) verwenden. Sehen:
Verwenden Sie die Syntax grep --exclude / - include, um bestimmte Dateien nicht zu durchsuchen
quelle
@Marcin: awk Beispiel nicht gierig:
quelle
quelle
Verwenden der Option
ex
/vi
editor und globstar (Syntax ähnlich wieawk
undsed
):Wo
aaa
ist Ihr Startpunkt undbbb
Ihr Endtext?Um rekursiv zu suchen, versuchen Sie:
Hinweis: Um die
**
Syntax zu aktivieren , führen Sieshopt -s globstar
(Bash 4 oder zsh) aus.quelle