grep
поддерживает регулярные выражения PCRE при использовании флага -P
.
Одна из причин, по которой grep -e "^(?>.*)(?<=abcd)$"
не работает, заключается в том, что используемый вами обходной путь является положительным, что означает полную противоположность тому, чтотребуется.(?<=
- это синтаксис для положительного просмотра, который указывает механизму регулярных выражений искать строки, которые заканчиваются на abcd
.
Для поиска строк, которые не заканчиваются определенной строкой, вынужно использовать отрицательный взгляд назад.Синтаксис для негативного вида сзади - (?<!
.И поскольку в отрицательном виде есть восклицательный знак, который bash будет пытаться интерпретировать как событие, нельзя использовать двойные кавычки для предоставления регулярного выражения в grep
.
Я использовал следующее регулярное выражение для поиска строк, которые не заканчиваютсяс log
.
grep -P '(?<!log)$' < <inputfile>
Аналогичным образом вы можете использовать вышеуказанную команду и заменить log
на любой шаблон, который вы хотите сопоставить.
Это регулярное выражение может использоваться с другими программами, где обратное сопоставлениене поддерживается, например -v
опция grep