Ich möchte die Mehrfachmusterübereinstimmung mit implizitem UND zwischen Mustern erhalten, dh gleichbedeutend mit dem Ausführen mehrerer Greps in einer Sequenz:
grep pattern1 | grep pattern2 | ...
Also, wie konvertiert man es in so etwas wie?
grep pattern1 & pattern2 & pattern3
Ich würde gerne single grep verwenden, weil ich Argumente dynamisch aufbaue, also muss alles in einen String passen. Die Verwendung von Filter ist eine Systemfunktion und kein Argument.
Verwechseln Sie diese Frage nicht mit:
grep "pattern1\|pattern2\|..."
Dies ist eine ODER-Verknüpfung mit mehreren Mustern.
grep
regular-expression
Greenoldman
quelle
quelle
Antworten:
agrep
kann es mit dieser Syntax tun:Mit GNU können Sie
grep
, wenn es mit PCRE-Unterstützung erstellt wurde, Folgendes tun:Mit ast
grep
:(Das Hinzufügen von
.*
s als<x>&<y>
Übereinstimmungszeichenfolgen, die beide<x>
und<y>
genau übereinstimmen ,a&b
würde niemals übereinstimmen, da es keine solche Zeichenfolge gibt, die beidea
undb
gleichzeitig sein kann.)Wenn sich die Muster nicht überlappen, können Sie möglicherweise auch Folgendes tun:
Der beste portable Weg ist wahrscheinlich mit
awk
wie schon erwähnt:Mit
sed
:Bitte beachten Sie, dass alle diese Ausdrücke eine andere Syntax für reguläre Ausdrücke haben.
quelle
agrep
Syntax funktioniert bei mir nicht ... In welcher Version wurde sie eingeführt?agrep
können mit glimpse / webglimpse gefunden werden . Möglicherweise haben Sie eine andere Implementierung. Ich hatte einen Fehler für die Ast-Grep-Version, die Option für erweiterte reguläre Ausdrücke ist jedoch-X
nicht-A
.agrep
0.8.0 für Fedora 23. Dies scheint eine andere zu seinagrep
als die, auf die Sie verweisen.agrep
.awk '/p1/ && /p2/ {n++}; END {print 0+n}'
Sie haben keine grep-Version angegeben, dies ist wichtig. Einige reguläre Ausdrücke ermöglichen mehrere Übereinstimmungen, die durch UND mit '&' gruppiert werden. Dies ist jedoch keine Standard- und keine portable Funktion. Aber zumindest GNU grep unterstützt dies nicht.
OTOH Sie können grep einfach durch sed, awk, perl usw. ersetzen (in der Reihenfolge der Gewichtszunahme aufgeführt). Mit awk würde der Befehl so aussehen
und es kann so konstruiert werden, dass es auf einfache Weise in der Befehlszeile angegeben wird.
quelle
awk
EREs verwendet werden, z. B. das Äquivalent vongrep -E
, im Gegensatz zu den BREs, die normalgrep
verwendet werden.awk
Die regulären Ausdrücke von werden als EREs bezeichnet, aber in Wirklichkeit sind sie etwas eigenwillig. Hier sind wahrscheinlich mehr Details, als jemand interessiert: wiki.alpinelinux.org/wiki/Regexawk
- einfach zu wissen, dass mehr besser ist).{ print; }
Teil hier nicht wirklich notwendig oder nützlich ist.Wenn
patterns
ein Muster pro Zeile enthalten ist, können Sie folgendermaßen vorgehen:Oder dies entspricht Teilzeichenfolgen anstelle von regulären Ausdrücken:
patterns
Ersetzen SieNR==FNR
mitFILENAME==ARGV[1]
oder mitARGIND==1
in , um alle anstelle von keinen Zeilen der Eingabe in dem Fall zu drucken, der leer istgawk
.Diese Funktionen geben die Zeilen von STDIN aus, die jede als Argument angegebene Zeichenfolge als Teilzeichenfolge enthalten.
ga
steht für grep all undgai
ignoriert Groß- und Kleinschreibung.quelle
Dies ist keine sehr gute Lösung, zeigt aber einen etwas coolen "Trick"
quelle
chained-grep()
oderfunction chained-grep
aber nichtfunction chained-grep()
: unix.stackexchange.com/questions/73750/…git grep
Hier ist die Syntax, bei
git grep
der mehrere Muster mithilfe von Booleschen Ausdrücken kombiniert werden :Mit dem obigen Befehl werden Zeilen gedruckt, die mit allen Mustern auf einmal übereinstimmen.
Suchen Sie
man git-grep
nach Hilfe.Siehe auch:
Zum OP siehe:
quelle
ripgrep
Hier ist das Beispiel mit
rg
:Es ist eines der schnellsten Grepping-Tools, da es auf Rusts Regex-Engine aufbaut, die endliche Automaten, SIMD und aggressive wörtliche Optimierungen verwendet, um die Suche sehr schnell zu machen.
Siehe auch zugehörige Funktionsanforderung bei GH-875 .
quelle
Hier ist meine Einstellung, und dies funktioniert für Wörter in mehreren Zeilen:
Verwenden Sie
find . -type f
gefolgt von so vielen-exec grep -q 'first_word' {} \;
und dem letzten Schlüsselwort mit
-exec grep -l 'nth_word' {} \;
-q
Leise / stille-l
Dateien mit Übereinstimmungen anzeigenDie folgende Liste enthält die Dateinamen mit den Wörtern "Hase" und "Loch":
find . -type f -exec grep -q 'rabbit' {} \; -exec grep -l 'hole' {} \;
quelle
Um ALLE Wörter (oder Muster) zu finden, können Sie in der FOR-Schleife grep ausführen . Der Hauptvorteil hierbei ist die Suche aus einer Liste von regulären Ausdrücken .
BEARBEITEN Sie meine Antwort mit einem echten Beispiel:
Lassen Sie es uns nun auf dieser Datei ausführen:
quelle
ALL
Operator gefragt , Ihr Code funktioniert alsOR
Operator, nichtAND
. Und übrigens. denn das (OR
) ist viel einfacher Lösung direkt in der Frage gegeben.AND
Operator gefragt , was bedeutet, dass die Datei nur dann positiv ist, wenn sie mit Muster A und Muster B und Muster C übereinstimmt und ...AND
In Ihrem Fall ist die Datei positiv, wenn sie übereinstimmt Muster A oder Muster B oder ... Sehen Sie jetzt den Unterschied?AND
. Dann sollten Sie das Skript so umschreiben, dass es für mehrere Dateien ausgeführt wird. Vielleicht stellen Sie dann fest, dass die Frage bereits beantwortet ist und Ihr Versuch nichts auf den Tisch bringt.