为何grep匹配带空格的'print '时无法找到目标文件?
嗨,我来帮你拆解下这个问题——核心问题出在你命令里的-w(也就是--word-regexp)选项上,和字符编码关系不大哦!
为什么带空格的搜索会失败?
-w选项的作用是只匹配完整的单词,这里的“单词”指的是由字母、数字、下划线组成的连续序列,或者位于行首/行尾的序列。当你搜索'print '(带空格)时,空格属于单词的分隔符,print 本身并不是一个完整的单词,所以-w会过滤掉这个匹配,自然找不到对应的文件。
而你第一个命令搜索'print'时,-w能匹配到文件里的print作为完整单词(不管它后面有没有空格),所以能正常输出文件名。
怎么修改命令?
根据你的需求,有两种调整方式:
直接去掉
-w选项(最直接):
如果你只是要找包含print后跟空格的内容,不需要强制匹配整词,去掉-w后命令就能正常工作:grep --include=script.py -rnlF '/path/' -e 'print '另外提一句,你之前写的
--include=\script.py里的反斜杠没必要,直接写script.py就可以啦。用正则表达式精确匹配(如果需要避免类似
printFoo这种无关匹配):
如果你想确保print后面确实是空格,同时又不想匹配print后跟其他字符的情况,可以去掉-F(固定字符串匹配)选项,用正则表达式来匹配:grep --include=script.py -rnl '/path/' -e 'print\s'这里的
\s会匹配任意空白字符(包括空格、制表符等),如果只想匹配半角空格,直接写'print '就行。
关于字符编码的疑问
大概率不是编码问题~如果担心文件里的空格是全角空格(和半角空格不一样),可以用cat -A /path/script.py查看:半角空格会显示为普通的 ,全角空格会显示为M-BM- 之类的特殊标记。但根据你第一个命令能正常找到文件的情况,编码问题的可能性极低。
内容的提问来源于stack exchange,提问作者John James

