Grep. Строка текста, которая не заканчивается на «abcd»? - PullRequest
17 голосов
/ 15 мая 2011

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

Есть идеи для нужного мне выражения?

Ответы [ 3 ]

26 голосов
/ 15 мая 2011

Посмотрите на опцию Grep -v

grep -v 'abcd$'

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

grep -v '\babcd$'

\b означает «граница слова»

3 голосов
/ 15 мая 2011

Дайте этому шанс:

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 букв

1 голос
/ 30 декабря 2012

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

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

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

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

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

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

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

...