Я хотел бы показать все строки кроме те, которые содержат foo
, , если они также не содержат bar
. Логически !(foo and (!bar)) === (!foo) or bar
, поэтому я могу использовать два отдельных выражения. Могу ли я сделать такое соответствие с одним grep
или egrep
? -v
не работает, поскольку он отрицает оба выражения, и я, вероятно, не могу использовать регулярное выражение Perl.
Следующее работает, но было бы гораздо меньше работы по преобразованию кода, если бы это можно было сделать в egrep
:
$ echo '
foo
bar
moofoo
foobar
barbar' | grep -Pv '^((?!bar).)*foo((?!bar).)*$'
bar
foobar
barbar
Проблема под рукой - скорость (поиск шаблонов в гигабайтах данных).