Grep. Линия текста, которая не заканчивается на "abcd"?

Привет Я ищу регулярное выражение для строки текста, которая не заканчивается определенным словом, скажем, это "abcd"
Сначала я попытался с
.*[^abcd]$
Конечно, это не работает. Он соответствует строке, которая не заканчивается ни одной буквой a, b, c или d.
Итак, в Advanced Grep Topics я нашел это выражение, но не смог заставить его работать:
^(?>.*)(?<=abcd)
- >
grep -e "^(?>.*)(?<=abcd)$"

Любая идея для выражения, которое мне нужно?

Ответы

Ответ 1

Посмотрите на вариант Grep -v

grep -v 'abcd$'

Если вы действительно имели в виду слово, а просто "последовательность символов", используйте

grep -v '\babcd$'

\b Значение слова "граница"

Ответ 2

Сделайте снимок:

grep -v "\<abcd\>$"

Доказательство концепции

$ printf "%s\n" "foo abcd bar baz" "foo bar baz abcd" "foo bar bazabcd" | grep -v "\<abcd\>$"
foo abcd bar baz
foo bar bazabcd

Примечание. Это будет соответствовать целым словам, как было отмечено тем фактом, что была возвращена 3-я строка, хотя она содержала abcd как последние 4 буквы

Ответ 3

grep поддерживает регулярные выражения PCRE при использовании флага -P.

Одна из причин, почему grep -e "^(?>.*)(?<=abcd)$" не работает, - это то, что поиск, используемый вами, является положительным, что означает совершенно противоположное тому, что требуется. (?<= - это синтаксис для положительного lookbehind, который сообщает движку regex искать строки, которые заканчивается с помощью abcd.

Чтобы искать строки, которые не заканчиваются определенной строкой, вам нужно использовать отрицательный lookbehind. Синтаксис для отрицательного lookbehind (?<!. И поскольку отрицательный lookbehind включает восклицательный знак, который bash будет пытаться интерпретировать как событие, нельзя использовать двойные кавычки для предоставления регулярного выражения до grep.

Я использовал следующее регулярное выражение для поиска строк, которые не заканчиваются на log.

grep -P '(?<!log)$' < <inputfile>

Аналогичным образом вы можете использовать команду выше и заменить log на любой шаблон, который вы хотите сопоставить.

Это регулярное выражение может использоваться с другими программами, где не поддерживается обратное сопоставление, например -v опция grep