Регулярные выражения Perl поддерживают негативный взгляд , функцию (?!)
, которую вы пытались использовать. Это идеальный способ выразить идею «foo, но не foobar».
grep -P 'foo(?!bar)'
Если вы ограничены расширенными регулярными выражениями POSIX, эквивалентной функции нет. Можно, но довольно сложно найти несоответствие без негативных взглядов.
Один из способов сделать это - проверить символ за символом в следующем foo
. Следующий символ - либо
- Конец строки (
$
)
- Любой символ, кроме "b" (
[^b]
)
- A "b" (
b
)
Если вы завершили один из двух первых случаев, это совпадение. Если это b
, вы должны проверить символ, следующий за b
, используя тот же шаблон из трех частей. Шаблон выглядит как $|[^b]|b(...)
, где ...
представляет собой вложенный шаблон. Собрав все вложенные шаблоны, вы получите:
grep -E 'foo($|[^b]|b($|[^a]|a($|[^r])))'