Ich habe versucht, eine Zeile zu filtern, in der die Wörter "Zitrone" und "Reis" vorkommen. Ich weiß, wie man "Zitrone" oder "Reis" findet, aber nicht die beiden. Sie müssen nicht nebeneinander stehen, sondern nur dieselbe Textzeile.
text-processing
grep
Sebastian
quelle
quelle
Antworten:
"Beide in derselben Zeile" bedeutet "Reis", gefolgt von zufälligen Zeichen, gefolgt von "Zitrone" oder umgekehrt ".
In Regex ist das
rice.*lemon
oderlemon.*rice
. Sie können dies kombinieren mit|
:Wenn Sie normale reguläre Ausdrücke anstelle von erweiterten Ausdrücken (
-E
) verwenden möchten, müssen Sie vor dem|
folgenden Schrägstrich einen umgekehrten Schrägstrich einfügen :Für mehr Wörter, die schnell etwas länger werden und es normalerweise einfacher ist, mehrere Aufrufe von zu verwenden
grep
, zum Beispiel:quelle
grep rice
findet Zeilen mitrice
. Es wird eingespeist, ingrep lemon
die nur zitronenhaltige Zeilen gelangen. Während der OP - sowie Ihre vorherigen Antworten - erlaubt jeder von [Reis | Zitrone | Huhn]|
man entkommen mussgrep
? Vielen Dank!egrep
verwendet erweiterte reguläre Ausdrücke, wobei dies|
als ODER-Logik verstanden wird.grep
Der\|
grep
der Manpage von angegeben,egrep
ist veraltet und sollte durch ersetzt werdengrep -E
. Ich habe mir die Freiheit genommen, die Antwort entsprechend zu bearbeiten.Sie können die Ausgabe des ersten grep-Befehls an einen anderen grep-Befehl leiten, der beiden Mustern entspricht. Sie können also Folgendes tun:
oder,
Beispiel:
Fügen wir unserer Datei einige Inhalte hinzu:
Was enthält die Datei:
Lassen Sie uns nun sagen, was wir wollen:
Wir erhalten nur die Linien, bei denen beide Muster übereinstimmen. Sie können dies erweitern und die Ausgabe für weitere "AND" -Matches an einen anderen grep-Befehl leiten.
quelle
Obwohl die Frage nach "grep" fragt, dachte ich, dass es hilfreich sein könnte, eine einfache "awk" -Lösung zu posten:
Dies kann leicht mit mehr Wörtern oder anderen booleschen Ausdrücken außer 'und' erweitert werden.
quelle
Eine andere Idee, um die Übereinstimmungen in beliebiger Reihenfolge zu finden, ist:
grep mit
-P
(Perl-Compatibility) Option und positivem Lookahead Regex(?=(regex))
:oder Sie können stattdessen unten verwenden:
.*?
bedeutet, dass alle Zeichen gefunden werden.
, die nicht oder mehrmals vorkommen,*
wenn sie optional sind, gefolgt von einem Muster (rice
oderlemon
). Das?
macht alles optional davor (bedeutet null oder einmal von allem zusammengepasst.*
)(?=pattern)
: Positiver Lookahead: Das positive Lookahead-Konstrukt besteht aus zwei Klammern, wobei die öffnende Klammer von einem Fragezeichen und einem Gleichheitszeichen gefolgt wird.Dies gibt also alle Zeilen mit sowohl
lemon
als auchrice
in zufälliger Reihenfolge zurück. Auch dies vermeidet die Verwendung von|
s und doppeltengrep
s.Externe Links: Erweiterte Grep-Themen Positive Lookahead - GREP für Designer
quelle
Gibt Streichhölzer für Foo oder Goo zurück
quelle
Wenn wir zugeben, dass es
grep
akzeptabel ist, eine Antwort zu liefern, die nicht auf der obigen Antwort basiertawk
, würde ich eine einfacheperl
Zeile vorschlagen , wie:Die Suche kann Groß- / Kleinschreibung mit einigen / allen Wörtern ignorieren
/lemon/i and /rice/i
. Auf den meisten Unix / Linux-Rechnern ist Perl genauso installiert wie awk.quelle
Hier ist ein Skript zur Automatisierung der grep-Piping-Lösung:
quelle
eval