如何使用否定“?!”在grep reg exp

时间:2017-03-04 15:19:51

标签: regex bash grep

我想在参数中找到所有不包含sizeof()的malloc函数。所以我做了正则表达 - malloc\((?!.*sizeof\().*\);

问题是它在reg exp online tolls工作但不是当我尝试在grep中使用它时。

实施例

cat file | grep "malloc\((?!.*sizeof\().*\);" 

解答:

bash: !.sizeof\: event not found

有什么想法吗?也许 ”?!”在grep reg exps中不起作用“?

3 个答案:

答案 0 :(得分:3)

Grep默认引擎遵循BRE语法,因此使用否定前瞻(?!...)毫无意义,可能会导致不必要的行为。设置-P(: - perl-regexp)以便能够使用它:

cat file | grep -P 'malloc\((?!.*sizeof\().*\);'

答案 1 :(得分:1)

我会使用awk

awk '/malloc/ && !/sizeof/' file

如果您需要使用grep,让我们说做作业,您需要使用grep两次:

grep malloc file | grep -v sizeof

-v恢复匹配,这意味着grep将输出与模式不匹配的行。

你说:

  

问题是它适用于reg exp在线工具,但在我尝试在grep中使用时却没有。

您的在线工具似乎没有使用POSIX regular expressions作为grep。请参阅POSIX文档(或阅读man grep

答案 2 :(得分:1)

您正在使用"..."。 Bash评估"..."内部的一些结构,如$PWD`pwd`!$

检查man bash !个表达式。您可以使用\来阻止bash尝试评估并将! ...!传递到grep的内容失败。