为什么 grep 搜索部分单词时找不到?

为什么 grep 搜索部分单词时找不到?

我曾多次遇到过这样的情况:当我想搜索单词的一部分时,grep 无法找到那些匹配项。当我搜索完整单词时它起作用。

例如,我需要找到所有包含“mysql_”单词的文件。因为我正在处理使用“mysql”而不是“mysqli”来处理数据库的遗留代码,并且想查看有多少代码使用“mysql”。

现在,我的命令是

grep -rnw './' -e "mysql_"

或者

grep -P -rnw '\bmysql_' .

这还是不行。

但如果我输入:

grep -rnw './' -e "mysql_query"

当然,grep 会找到所有匹配项。

我究竟做错了什么?

答案1

因为您使用的是 '-w' 参数,这意味着您的搜索模式应作为完整单词出现(换句话说,是分隔的“非单词”字符):

  -w, --word-regexp
          Select only those lines containing matches that form  whole  words.   The
          test  is  that  the matching substring must either be at the beginning of
          the line, or preceded by a non-word constituent character.  Similarly, it
          must  be  either  at  the  end  of  the  line  or  followed by a non-word
          constituent character.  Word-constituent characters are letters,  digits,
          and the underscore.

请注意,在正则表达式中,下划线是“单词”字符。

由于mysql_仅作为单词的一部分出现(如mysql_query),grep -w因此不报告它。

相关内容