人们可以用来-v
从文件中排除单个单词,但我想知道为什么正则表达式模式?!
不适用于grep
/ egrep
。
我正在寻找一种模式来从编辑器的文件中的搜索中排除单个单词,atom
并发现这关联。该?!
作品完美地在atom
.我bash
必须先关闭histexpand
,set +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
手册(我的重点):
仅反斜杠 (
\
)和单引号可以引用历史扩展字符,但如果历史扩展字符紧接在双引号字符串中的结束双引号之前,则也将其视为带引号的。