Grep версии обоих или ни одного из них:
grep -v -P '((?=.*aaaa)(?!.*bbbb))|((?=.*bbbb)(?!.*aaaa))'
Но, пожалуйста, не используйте grep
в этом случае. Отрицательный и позитивный взгляд в будущее может легко привести к Катастрофе c Возврат
GNU grep
знает Perl совместимый синтаксис регулярного выражения (PCRE) (опция -P
). Эта вещь все еще называется «регулярным» выражением, хотя оно больше не является регулярным. Другие люди более откровенны и вызывают обратный вызов нерегулярных выражений.
Как это работает:
(?=.*aaaa)
соответствует aaaa
в любом месте строки, но не перемещает курсор. После совпадения следующий поиск начинается в начале строки.
(?!.*bbbb)
совпадает, если в строке нет bbbb
и курсор также не перемещается.
Оба совпадения совпадают строки, которые включают aaaa
, но не включают bbbb
.
Это один из случаев, который вы хотите исключить из результатов поиска. Второе после условия или (|
) - это другое, которое вы хотите исключить: любое bbbb
без aaaa
.
. Выше вы определили, что вам не нужно. Затем используйте -v
, чтобы инвертировать поиск, чтобы получить то, что вы хотите.