为什么正则表达式模式是“?!”不使用 grep 吗?

为什么正则表达式模式是“?!”不使用 grep 吗?

人们可以用来-v从文件中排除单个单词,但我想知道为什么正则表达式模式?!不适用于grep/ egrep

我正在寻找一种模式来从编辑器的文件中的搜索中排除单个单词,atom并发现关联。该?!作品完美地在atom.我bash必须先关闭histexpandset +H否则你会得到搜索历史-bash: !xxx: event not found记录。!pattern之后我尝试了类似的东西echo "no" | grep "^(?!yes).*",但grep不知何故无法识别该?!模式 - 为什么会这样?

答案1

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

该表达式不是标准的基本正则表达式,也不是标准的扩展正则表达式,而是 PCRE,即“Perl 兼容正则表达式”。如果您使用带有其标志的实用程序, GNUgrep就会知道这些-P

将表达式放在单引号中(您应该这样做,因为它是静态字符串)还会阻止bash将 识别?!yes为历史扩展模式。

来自 GNUgrep手册:

-P,--perl-regexp

将该模式解释为与 Perl 兼容的正则表达式 (PCRE)。这是实验性的,grep -P可能会警告未实现的功能。

bash手册(我的重点):

仅反斜杠 ( \)和单引号可以引用历史扩展字符,但如果历史扩展字符紧接在双引号字符串中的结束双引号之前,则也将其视为带引号的。

相关内容