在grep正则expression式中转义特殊字符

我试图在一个文件上运行一个grep正则expression式,在那里我必须排除出现“00”和“0”的行。 我想出了这个expression方式:

grep -a -E \"stored\"\:\ \"\*123\*(?!00)[0-9]{2,5}\#\" $filename

但是当我试图用bash运行它时,我得到了

-bash !00: event not found ,或者(一旦我input了set +H ),

-bash: syntax error near unexpected token ('`

请问我需要做什么才能在bash中正确地逃避这个正则expression式?

你得到一个错误信息,因为你没有逃脱! ,这在shell中有着特殊的含义。 要使用它作为grep模式参数的一部分,必须引用它或转义它。

而不是逐一引用每一个特殊字符,把整个模式放在单引号或双引号(取决于你的目的)是很容易的,例如:

 grep -a -P '"stored": "*123*(?!00)[0-9]{2,5}#"' 

另外请注意,我用-Preplace了-E ,因为在grep扩展正则expression式的典型实现中,负向前瞻(?!...)不起作用。 -P标志启用Perl正则expression式,应该支持这个。