Ответ 1
Посмотрите на вариант Grep -v
grep -v 'abcd$'
Если вы действительно имели в виду слово, а просто "последовательность символов", используйте
grep -v '\babcd$'
\b
Значение слова "граница"
Привет Я ищу регулярное выражение для строки текста, которая не заканчивается определенным словом, скажем, это "abcd"
Сначала я попытался с .*[^abcd]$
Конечно, это не работает. Он соответствует строке, которая не заканчивается ни одной буквой a, b, c или d.
Итак, в Advanced Grep Topics я нашел это выражение, но не смог заставить его работать: ^(?>.*)(?<=abcd)
- > grep -e "^(?>.*)(?<=abcd)$"
Любая идея для выражения, которое мне нужно?
Посмотрите на вариант Grep -v
grep -v 'abcd$'
Если вы действительно имели в виду слово, а просто "последовательность символов", используйте
grep -v '\babcd$'
\b
Значение слова "граница"
Сделайте снимок:
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 буквы
grep
поддерживает регулярные выражения PCRE при использовании флага -P
.
Одна из причин, почему grep -e "^(?>.*)(?<=abcd)$"
не работает, - это то, что поиск, используемый вами, является положительным, что означает совершенно противоположное тому, что требуется. (?<=
- это синтаксис для положительного lookbehind, который сообщает движку regex искать строки, которые заканчивается с помощью abcd
.
Чтобы искать строки, которые не заканчиваются определенной строкой, вам нужно использовать отрицательный lookbehind. Синтаксис для отрицательного lookbehind (?<!
. И поскольку отрицательный lookbehind включает восклицательный знак, который bash будет пытаться интерпретировать как событие, нельзя использовать двойные кавычки для предоставления регулярного выражения до grep
.
Я использовал следующее регулярное выражение для поиска строк, которые не заканчиваются на log
.
grep -P '(?<!log)$' < <inputfile>
Аналогичным образом вы можете использовать команду выше и заменить log
на любой шаблон, который вы хотите сопоставить.
Это регулярное выражение может использоваться с другими программами, где не поддерживается обратное сопоставление, например -v
опция grep