Если ваш grep не поддерживает -P или -perl-regexp, и вы можете установить grep с поддержкой PCRE, например. «Pcregrep», чем не будет нуждаться в каких-либо параметров командной строки, такие как GNU Grep принять Perl-совместимые регулярные выражения, вы просто запустите
pcregrep "Ui\.(?!Line)"
Вам не нужна еще одна вложенная группа для «линии», как и в ваш пример «Ui. (?! (Line))» - внешняя группа достаточна, как показано выше.
Позвольте мне привести еще один пример ожидающих отрицательных утверждений: когда у вас есть список строк, возвращаемых «ipset», каждая строка показывает количество пакетов в середине строки и вам не нужны строки с нулем пакеты, просто запустите:
ipset list | pcregrep "packets(?! 0)"
Если вам нравится Perl-совместимых регулярных выражений и имеют Perl, но не имеют pcregrep или ваш Grep не поддерживает --perl-регулярное выражение, вы можете вы одна линия Perl скрипты, которые работают так же, как grep:
perl -e "while (<>) {if (/Ui\.(?!Lines)/){print;};}"
Perl принимает stdi n аналогично grep, например.
ipset list | perl -e "while (<>) {if (/packets(?! 0)/){print;};}"
Какие подвид регулярного выражения - PCRE, ERE, BRE, grep, ed, sed, perl, python, Java, C, ...? –
Использование его с grep. –
Как в стороне, «событие не найдено» происходит от использования расширения истории. Возможно, вы захотите отключить расширение истории, если вы никогда не используете его, а иногда хотите использовать восклицательный знак в своих интерактивных командах. 'set + o histexpand' в Bash или' set + H', YMMV. – tripleee