Расширенное регулярное выражение: найдите слово, которое не является частью другого слова - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь найти слова в файле, используя egrep. Я ограничен egrep и не могу добавить опцию -v, поэтому я должен сделать это через шаблон.

Файл примера

... blah
blah foo blah
blah foobar blah
bhah_foobaz_blah
blah ...

Желаемый выход

blah foo blah
bhah_foobaz_blah

Я хочу найти каждую строку, содержащую экземпляр foo, который не является частью слова foobar.

Из того, что я мог найти до сих пор, я думал, что это будет что-то вроде этого, но ничего не возвращает:

egrep -i 'foo+^((?!bar).)*' 

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Регулярные выражения Perl поддерживают негативный взгляд , функцию (?!), которую вы пытались использовать. Это идеальный способ выразить идею «foo, но не foobar».

grep -P 'foo(?!bar)'

Если вы ограничены расширенными регулярными выражениями POSIX, эквивалентной функции нет. Можно, но довольно сложно найти несоответствие без негативных взглядов.

Один из способов сделать это - проверить символ за символом в следующем foo. Следующий символ - либо

  1. Конец строки ($)
  2. Любой символ, кроме "b" ([^b])
  3. A "b" (b)

Если вы завершили один из двух первых случаев, это совпадение. Если это b, вы должны проверить символ, следующий за b, используя тот же шаблон из трех частей. Шаблон выглядит как $|[^b]|b(...), где ... представляет собой вложенный шаблон. Собрав все вложенные шаблоны, вы получите:

grep -E 'foo($|[^b]|b($|[^a]|a($|[^r])))'
0 голосов
/ 06 ноября 2018

Это может быть то, что вы ищете

egrep '\bfoo\b'

, что соответствует границам слова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...