我想搜索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+
与宏中的空格不匹配?
我认为它应该匹配至少一个空格。
答案 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 ./