Двойной / наполовину перевернутый egrep - PullRequest
1 голос
/ 27 декабря 2010

Я хотел бы показать все строки кроме те, которые содержат 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

Проблема под рукой - скорость (поиск шаблонов в гигабайтах данных).

1 Ответ

1 голос
/ 23 февраля 2011

Если использование awk в порядке, то следующее дает желаемый результат

awk 'BEGIN {FS=" "};
           {
               if ($0 ~ /(foo)/) 
               {
                    if ($0 ~ /(bar)/) 
                    {
                       print $0
                    } 
               } 
               else 
               {
                    print $0
               }
           }' FileContainingText.txt

, так как это работает для каждой строки и не задействованы каналы, это должно быть быстро.

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