为什么\ s +与宏中的空格不匹配grep?

时间:2017-08-30 16:11:14

标签: regex shell grep

我想搜索ZEND_BEGIN_ARG_INFO_EX

的宏定义

所以我运行命令

 grep   "define\s+ZEND_BEGIN_ARG_INFO_EX" -r  ./ 

但它一无所获。

所以,我试试

grep   "define\s*ZEND_BEGIN_ARG_INFO_EX" -r  ./

成功返回ZEND_BEGIN_ARG_INFO_EX的定义,返回

./Zend/zend_API.h:#define ZEND_BEGIN_ARG_INFO_EX  ....

我的问题:

为什么\s+与宏中的空格不匹配?

我认为它应该匹配至少一个空格。

2 个答案:

答案 0 :(得分:2)

这里有两个问题:

  • \s是PCRE语法。 grep支持BRE(默认情况下)或ERE(当调用egrep或传递-E参数时),但PCRE不支持非标准扩展。请改用[[:space:]]

  • +是ERE语法,而默认情况下grep使用BRE。将-E传递给grep,或将其作为egrep调用,以启用ERE。

因此:

grep -Ere "define[[:space:]]+ZEND_BEGIN_ARG_INFO_EX" ./

答案 1 :(得分:2)

Linux附带的标准 grep不接受+,仅接受*。你可以这样说:

grep "define\s\s*ZEND_BEGIN_ARG_INFO_EX" -r ./ 

或者

grep -E "define\s+ZEND_BEGIN_ARG_INFO_EX" -r ./