Manchmal möchte ich testen, ob mein regulärer Ausdruck korrekt ist.
Wie kann ich eine umgekehrte regex
Übereinstimmung von der Standardeingabe aus durchführen?
Beispielsweise kann ich eine Zeichenfolge mit dem bereitgestellten regulären Ausdruck abgleichen, etwa:
grep "\(foo\)-bar"
foo
bar
foo-bar
foo-bar #Match found
Ich möchte das Gegenteil tun, etwa so:
$ grep "This is one string"
\(This\) #Will send "This" to stdout
This?.* #Will send full match
Ist das irgendwie ohne viel Scripting möglich?
Antwort1
Definieren Sie die folgende Funktion in Ihrer Shell (Sie können sie einfach eintippen oder in Ihre einfügen ~/.bashrc
):
testregex() {
[ "$#" -eq 1 ] || return 1
while IFS= read -r line; do
printf '%s\n' "$1" | grep -Eoe "$line"
done
}
Anschließend können Sie einen regulären Ausdruck wie folgt testen:
$ testregex 'This is a line'
This <--input
This <--output
This?.* <--input
This is a line <--output
slkdjflksdj <--input with no output (no match)
s.* <--input
s is a line <--output
$ <--I pressed Ctrl-D to end the test
Antwort2
Sie können -
als „Datei“ für die Suche verwenden, wobei die Standardeingabe als „Heuhaufen“ verwendet wird, um in Folgendem nach passenden „Nadeln“ zu suchen:
$ grep -oE '[aeiou]+' -
This is a test < input
i > output
i > output
a > output
e > output
whaaaat? < input
aaaa > output
Verwenden Sie Ctrl- Dzum Senden EOF
und Beenden des Streams.
Ich glaube allerdings 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 in einem Korpus haben, können Sie:
grep -f needle-patterns haystack.txt
wobei needle-patterns
es sich um eine Klartextdatei mit einem regulären Ausdruck pro Zeile handelt.