Quiero encontrar coincidencias con las palabras circundantes.También quiero que sea rápido.
Esto es lo que tengo:
grep -o -P '(\w+ ){0,n}match( \w+){0,m}'
n es el número de palabras antes de la frase, m es el número de palabras después de la frase. coincidencia es la frase que estoy buscando.
¿Existe alguna forma más rápida de hacerlo?
ejemplo:
echo word1 word2 word3 123 word4 word5 word6 | grep -o -P '(\w+ ){0,2}123( \w+){0,2}'
=> word2 word3 123 word4 word5
.
Respuesta1
(\w+ )
coincidirá con una palabra o parte de una palabra. Esto significa que grep
tratará cada carácter de cada palabra como un posible inicio de partida. En su ejemplo, considerará cada uno de
word1
ord1
rd1
d1
1
antes de pasar al partido exitoso (comenzando en word2
).
Como está interesado en encontrar palabras completas, puede evitar todos los intentos de coincidencias a mitad de palabra incluyendo límites de palabras en el patrón:
grep -P '\<(\w+ ){0,2}123( \w+){0,2}\>'
Otro efecto de esto es evitar coincidencias 123
cuando aparece dentro de una palabra más larga.
Esto me redujo el tiempo en un factor de 100 (caso de prueba: buscar la palabra "yo" en Ulises)
La sección "Errores" dehttp://www.regular-expressions.info/examples.htmltiene algunos buenos consejos sobre lo que hace que las expresiones regulares sean lentas.