Quero encontrar correspondência com as palavras ao redor.Eu também quero que seja rápido.
Aqui está o que eu tenho:
grep -o -P '(\w+ ){0,n}match( \w+){0,m}'
n é o número de palavras antes da frase, m é o número de palavras depois da frase. match é a frase que estou procurando.
Existe alguma maneira mais rápida de fazer isso?
exemplo:
echo word1 word2 word3 123 word4 word5 word6 | grep -o -P '(\w+ ){0,2}123( \w+){0,2}'
=> word2 word3 123 word4 word5
.
Responder1
(\w+ )
corresponderá a uma palavra ou parte da palavra. Isso significa que grep
tratará cada caractere em cada palavra como um potencial início de partida. No seu exemplo, ele considerará cada um dos
word1
ord1
rd1
d1
1
antes de passar para a partida bem-sucedida (começando em word2
).
Como você está interessado em encontrar palavras inteiras, você pode evitar todas as tentativas de correspondência de palavras intermediárias incluindo limites de palavras no padrão:
grep -P '\<(\w+ ){0,2}123( \w+){0,2}\>'
Outro efeito disso é evitar a correspondência 123
quando ela aparece dentro de uma palavra mais longa.
Isso reduziu o tempo em um fator de 100 para mim (caso de teste: pesquisando a palavra 'eu' em Ulisses)
A seção "Armadilhas" dohttp://www.regular-expressions.info/examples.htmltem algumas boas dicas sobre o que torna os regexps lentos.