grep – исключить строку, которая не является подстрокой строки

Я объясню свою проблему на Ubuntu 16.04 следующим примером: Файл:

# cat file aaa aaaxxx aaaxxx*aaa aaa=aaaxxx bbbaaaccc aaaddd/aaaxxx 

Я хочу отображать все строки, содержащие aaa но не в единственной комбинации aaaxxx . Мне нужен вывод следующим образом:

 # grep SOMETHING-HERE file … aaa aaaxxx*aaa (second aaa is the hit) aaa=aaaxxx (first aaa is the hit) bbbaaaccc (aaa in any other combination but not aaaxxx) aaaddd/aaaxxx (similar to above) 

Я пробовал такие вещи, как grep -v aaaxxx file | grep aaa grep -v aaaxxx file | grep aaa результат:

 aaa bbbaaaccc 

или

 # egrep -P '(?<!aaaxxx )aaa' file grep: die angegebenen Suchmuster stehen in Konflikt zueinander (the pattern are in contradiction) 

Есть ли (простая) возможность? Конечно, это не должно быть grep . благодаря

Это простое использование оператора взгляда perl-стиля – доступного в режиме регулярного выражения grep Perl Compatible Regular Expression (PCRE) с использованием ключа -P :

 $ grep -P 'aaa(?!xxx)' file aaa aaaxxx* aaa aaa =aaaxxx bbb aaa ccc aaa ddd/aaaxxx 

(полужирное форматирование на выходе указывает согласованные части, выделенные grep )


Хотя просмотр с нулевой длиной удобно, вы можете достичь того же результата с использованием синтаксиса расширенного регулярного выражения GNU (ERE), например, путем сопоставления aaa за которым следует до двух символов x за которыми следует символ x или конец строки т.е.

 grep -E 'aaax{0,2}([^x]|$)' file 

или даже с использованием синтаксиса основного регулярного выражения GNU (BRE)

 grep 'aaax\{0,2\}\([^x]\|$\)' file 

которые соответствуют

 aaa aaaxxx* aaa aaa= aaaxxx bbb aaac cc aaad dd/aaaxxx