Às vezes, quero testar se meu regex está correto.
Como posso fazer regex
a 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 EOF
e encerrar o stream.
Porém, não acredito que você possa fazer o mesmo para usar a entrada padrão para o -f
switch 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-patterns
está um arquivo de texto simples com uma expressão regular por linha.