Почему шаблон регулярного выражения ‘?!’ не работает с grep?

Можно использовать -v чтобы исключить одно слово из файла, но мне интересно, почему шаблон регулярных выражений ?! не работает с grep / egrep .

Я искал шаблон для исключения одного слова из моего поиска в файле в редакторе atom и нашел эту ссылку. ?! прекрасно работает в atom . В bash мне сначала пришлось отключить его histexpand с помощью set +H , в противном случае вы получите histexpand -bash: !xxx: event not found поскольку !pattern ищет историю. После этого я попробовал что-то вроде echo "no" | grep "^(?!yes).*" echo "no" | grep "^(?!yes).*" , но grep как-то не распознает ?! шаблон – почему это так?

 $ echo "no" | grep -P '^(?!yes).*' no 

Выражение не является стандартным базовым или стандартным расширенным регулярным выражением, а представляет собой PCRE, «Perl-совместимое регулярное выражение». GNU grep знает об этом, если вы используете утилиту с ее флагом -P .

Помещение выражения в одинарные кавычки (что следует делать, поскольку это статическая строка) дополнительно останавливает bash от распознавания ?!yes в качестве шаблона расширения истории.

Из руководства GNU grep :

-P , --perl-regexp

Интерпретировать шаблон как Perl-совместимое регулярное выражение (PCRE). Это экспериментально, и grep -P может предупредить о невыполненных функциях.

Из руководства по bash (мой акцент):

Только обратная косая черта ( \ ) и одинарные кавычки могут заключать в кавычки символ расширения истории, но символ раскрытия истории также рассматривается как заключенный в кавычки, если он непосредственно предшествует закрывающей двойной кавычке в строке в двойных кавычках.