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

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

我正在尝试对文件运行 grep 正则表达式,其中必须排除出现“00”和“0”的行。我想出了这个表达式:

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

但是当我尝试在 bash 中运行它时,我要么得到

-bash !00: event not found,或者(我输入后set +H),

-bash: syntax error near unexpected token('`

请问我需要做什么才能在 bash 中正确地转义这个正则表达式?

答案1

由于您未对 进行转义,因此您会收到一条错误消息!,这在 shell 中具有特殊含义。要将其用作 的模式参数的一部分grep,您必须将其括起来或进行转义。

不需要逐个引用每个特殊字符,而是将整个模式括在单引号或双引号中(取决于您的目的),这样更方便,例如:

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

还请注意,我用 替换了-E-P因为负向前瞻在扩展正则表达式(?!...)的典型实现中不起作用。该标志启用 Perl 正则表达式,它应该支持这一点。grep-P

相关内容