Testando regex de stdin usando grep | sed | awk

4

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

Como posso reverter regex de stdin?

F.e. Eu 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 oposto, 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 muito script?

    
por fugitive 31.05.2017 / 01:27

2 respostas

4

Você pode usar - como o "arquivo" a ser pesquisado, que usará a entrada padrão como "palheiro" para pesquisar "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 - D para enviar EOF e finalizar o fluxo.

Não acredito, no entanto, que você possa fazer o mesmo para usar a entrada padrão para a opção -f , que lê uma lista de padrões de um arquivo. No entanto, se você tiver muitos padrões para enviar texto em um corpus, poderá:

grep -f needle-patterns haystack.txt

em que needle-patterns é um arquivo de texto simples com uma expressão regular por linha.

    
por 31.05.2017 / 01:44
7

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

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

Você pode testar um 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
    
por 31.05.2017 / 02:31