Иногда мне хочется проверить, правильно ли мое регулярное выражение.
Как выполнить обратное regex
сопоставление со стандартным вводом?
Например, я могу сопоставить строку с предоставленным регулярным выражением, например:
grep "\(foo\)-bar"
foo
bar
foo-bar
foo-bar #Match found
Я бы хотел сделать наоборот, что-то вроде этого:
$ grep "This is one string"
\(This\) #Will send "This" to stdout
This?.* #Will send full match
Возможно ли это как-то без написания сценариев?
решение1
Определите следующую функцию в своей оболочке (вы можете просто ввести ее или поместить в свой ~/.bashrc
):
testregex() {
[ "$#" -eq 1 ] || return 1
while IFS= read -r line; do
printf '%s\n' "$1" | grep -Eoe "$line"
done
}
Затем вы можете проверить регулярное выражение следующим образом:
$ 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
решение2
Вы можете использовать -
в качестве «файла» для поиска, который будет использовать стандартный ввод в качестве «стога сена» для поиска соответствующих «иголок» в:
$ grep -oE '[aeiou]+' -
This is a test < input
i > output
i > output
a > output
e > output
whaaaat? < input
aaaa > output
Используйте Ctrl- Dдля отправки EOF
и завершения потока.
Я не верю, однако, что вы можете сделать то же самое, используя стандартный ввод для переключателя -f
, который считывает список шаблонов из файла. Однако, если у вас много шаблонов для текста в одном корпусе, вы можете:
grep -f needle-patterns haystack.txt
где needle-patterns
— текстовый файл с одним регулярным выражением на строку.