Как найти соответствие с окружающими словами?

Как найти соответствие с окружающими словами?

Я хочу найти соответствие с окружающими словами.Я также хочу, чтобы это было быстро.

Вот что у меня получилось:

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содержит несколько хороших указаний на то, что делает регулярные выражения медленными.

Связанный контент