grep搜索模式中的“ - ”

时间:2016-12-26 23:46:26

标签: php regex linux command-line grep

我使用以下命令搜索包含“send”

的所有PHP文件
 grep -rnw --include=\*.php -rnw '.' -e "send"

我试图做的时候

 grep -rnw --include=\*.php -rnw '.' -e "->send"

它什么都没有,为什么会这样?

 grep -rnw --include=\*.php -rnw '.' -e ">send"

这很好。只是不能在搜索模式中使用“ - ”

2 个答案:

答案 0 :(得分:4)

问题的根源

正如@Charles Duffy指出的那样,问题的根源是-w选项,导致Grep只选择那些包含构成整个单词的匹配的行("单词"被认为是字母,数字和下划线的序列)。但是,真正的问题不仅仅是-分成单词,而是

  

测试是匹配的子字符串必须位于行的开头,或前面是非单词构成字符 ....   单词构成字符是字母,数字和下划线。

因此,例如,$word->send()->send的{​​{1}}不匹配,因为-w -e之前的字符是字成分。但是- 将匹配,因为$word->m()->send()字符是非​​字成分。

PHP方法调用

由于您正在解析PHP文件,)字符串表示方法调用,这意味着前面的序列必须是 word-constituent 字符,可选地后跟空格或换行符:< / p>

->send

$object->send(); $object->methodOne()->send(); $object ->methodOne() ->send(); 之前包含空格字符和括号的个案将->send()匹配。但前面的字符是字母,数字或下划线(grep -w -e的情况与模式不匹配,因为$$object->send()要求前面的字符是非单词成分字符。

解决方案

因此,-w不适合以-w开头的模式,即使使用-也是如此。但只有当-e位于模式的开头或结尾时才会出现问题。您可以简单地转义它:-并匹配\-之后的非单词构成字符,即send[^_[:alnum:]]以获得扩展语法:

\W

就个人而言,我更喜欢grep '\->send[^_[:alnum:]]' grep -E '\->send\W' 来搜索方法调用,因为我们公司的编码标准不允许将方法调用的左括号放在方法名称旁边的行中。

答案 1 :(得分:2)

您在使用短划线开头的数据之前使用-e做正确的事情。突出的问题是-w参数。

grep -w匹配单词。 -分为两个单词。因此,你不能一起使用这些东西。

$ echo 'foo->send' | grep -e '->send'
foo->send
$ echo 'foo->send' | grep -w -e '->send'
$

而不是-w,请考虑仅使用[[:>:]]来匹配词尾,因为您的模式永远不会出现在单词的开头:

$ echo 'foo->send' | grep -e '->send[[:>:]]'
foo->send
$ echo 'foo->sender' | grep -e '->send[[:>:]]'
$