我曾多次遇到过这样的情况:当我想搜索单词的一部分时,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
因此不报告它。