Testando regex de stdin usando grep|sed|awk

Testando regex de stdin usando grep|sed|awk

Às vezes, quero testar se meu regex está correto.

Como posso fazer regexa correspondência reversa do stdin?

Fe, posso combinar uma string com o regex fornecido, como:

grep "\(foo\)-bar"
foo
bar
foo-bar
foo-bar #Match found

O que eu gostaria de fazer é o contrário, algo assim:

$ grep "This is one string"
\(This\) #Will send "This" to stdout
This?.*  #Will send full match

Isso é de alguma forma possível sem muitos scripts?

Responder1

Defina a seguinte função em seu shell (você pode simplesmente digitá-la ou colocá-la em seu ~/.bashrc):

testregex() {
  [ "$#" -eq 1 ] || return 1
  while IFS= read -r line; do
    printf '%s\n' "$1" | grep -Eoe "$line"
  done
}

Então você pode testar uma regex da seguinte maneira:

$ 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

Responder2

Você pode usar -como "arquivo" para pesquisar, que usará a entrada padrão como "palheiro" para procurar "agulhas" correspondentes em:

$ grep -oE '[aeiou]+' -
This is a test  < input
i               > output
i               > output
a               > output
e               > output
whaaaat?        < input
aaaa            > output

Use Ctrl- Dpara enviar EOFe encerrar o stream.

Porém, não acredito que você possa fazer o mesmo para usar a entrada padrão para o -fswitch que lê uma lista de padrões de um arquivo. No entanto, se você tiver muitos padrões para texto em um corpus, poderá:

grep -f needle-patterns haystack.txt

onde needle-patternsestá um arquivo de texto simples com uma expressão regular por linha.

informação relacionada