Manchmal möchte ich testen, ob meine Regex korrekt ist.
Wie kann ich Reverse regex
Match von stdin machen?
Zum Beispiel kann ich einen String mit dem bereitgestellten regulären Ausdruck abgleichen, wie zum Beispiel:
grep "\(foo\)-bar"
foo
bar
foo-bar
foo-bar #Match found
Was ich tun möchte, ist das Gegenteil, so etwas:
$ grep "This is one string"
\(This\) #Will send "This" to stdout
This?.* #Will send full match
Ist das irgendwie ohne viel Scripting möglich?
command-line
awk
sed
grep
regular-expression
Flüchtling
quelle
quelle
Antworten:
Sie können
-
als "Datei" für die Suche verwenden, wobei die Standardeingabe als "Heuhaufen" verwendet wird, um nach passenden "Nadeln" zu suchen in:Verwenden Sie Ctrl- D, um
EOF
den Stream zu senden und zu beenden.Ich glaube jedoch nicht, dass Sie dasselbe tun können, um die Standardeingabe für den
-f
Schalter zu verwenden, der eine Liste von Mustern aus einer Datei liest. Wenn Sie jedoch viele Muster für Text auf einem Korpus haben, können Sie:Dabei
needle-patterns
handelt es sich um eine Klartextdatei mit einem regulären Ausdruck pro Zeile.quelle
This?.*
, wie Sie gefragt haben.grep -f - haystack
, es wird sich beschweren, dass die Datei-
nicht existiert.grep
, Sie können verwendengrep -f - haystack
, aber es ist nicht sehr nützlich ohnehin für Zwecke des OP , weil sie warten, bis Sie Strg-D , um die Signaleingabeende drücken, und dann für jede Zeile in „Heuhaufen“ wird es nur entweder drucken oder nicht drucken - es wird nicht mehrmals gedruckt, wenn es mit mehreren Mustern übereinstimmt, und es wird nichts gedruckt, bis Sie alle Ihre Muster eingegeben haben.Definieren Sie die folgende Funktion in Ihrer Shell (Sie können sie einfach eingeben oder in Ihre Shell einfügen
~/.bashrc
):Dann können Sie eine Regex wie folgt testen:
quelle
grep
. Auf diese Weise können Sie mit BRE, ERE, PCRE und allem spielen, wofür Siegrep
Flaggen haben.testregex -program=sed 'This is a line'
, geben Sie ihm verschiedene Mustervarianten, rufen Sie das vorherige Muster mit den Pfeiltasten ab und bearbeiten Sie es - ähnlich wie im Bash-Befehlsverlauf. Weil es nicht sehr praktisch ist, jedes Mal ein ganzes Muster neu einzugeben.