Тестирование регулярных выражений из stdin с помощью grep|sed|awk

Тестирование регулярных выражений из stdin с помощью grep|sed|awk

Иногда мне хочется проверить, правильно ли мое регулярное выражение.

Как выполнить обратное 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— текстовый файл с одним регулярным выражением на строку.

Связанный контент