Я хочу найти соответствие с окружающими словами.Я также хочу, чтобы это было быстро.
Вот что у меня получилось:
grep -o -P '(\w+ ){0,n}match( \w+){0,m}'
n — количество слов перед фразой, m — количество слов после фразы. match — это фраза, которую я ищу.
Есть ли более быстрый способ сделать это?
пример:
echo word1 word2 word3 123 word4 word5 word6 | grep -o -P '(\w+ ){0,2}123( \w+){0,2}'
=> word2 word3 123 word4 word5
.
решение1
(\w+ )
будет соответствовать слову или части слова. Это означает, что grep
будет рассматривать каждый символ в каждом слове как потенциальное начало соответствия. В вашем примере он будет рассматривать каждый из
word1
ord1
rd1
d1
1
прежде чем перейти к успешному совпадению (начиная с word2
).
Поскольку вы заинтересованы в поиске целых слов, вы можете предотвратить все попытки поиска совпадений в середине слова, включив в шаблон границы слов:
grep -P '\<(\w+ ){0,2}123( \w+){0,2}\>'
Другим эффектом этого является предотвращение сопоставления 123
, если оно встречается внутри более длинного слова.
Это сократило время для меня в 100 раз (тестовый пример: поиск слова «я» в «Улиссе»).
Раздел «Подводные камни»http://www.regular-expressions.info/examples.htmlсодержит несколько хороших указаний на то, что делает регулярные выражения медленными.