使用 grep 时忽略包含在 '' 中的字符串

5 grep

当我尝试在文件中搜索字符串时,结果不包括用单引号括起来的字符串。

例如:

grep -rn text folder/
Run Code Online (Sandbox Code Playgroud)

结果不包括看起来像这样的字符串:

'text'
Run Code Online (Sandbox Code Playgroud)

介意告诉我我做错了什么吗?

更新:我刚刚用一个新文件对其进行了测试,并且成功了!看起来它只发生在一个特定的文件(一个 ruby​​ 文件)中。也许它与编码有关?

War*_*ung 7

您很有可能会遇到一些字符编码问题。您尝试 grep 的文件的字符编码可能与系统的默认编码不同。如今,Unixy 系统通常默认使用 UTF-8,它与 7 位 ASCII 兼容,但不与任何 8 位 ASCII 扩展兼容。美国常见的 8 位编码是ISO 8859-1Windows CP-1252。世界其他地方还有数十种使用。

grep假设所有输入都采用您的默认系统编码。对于grep不同编码的文件,使用iconv来转换它:

$ iconv -f iso8859-1 -t utf8 myfile.txt | grep something
Run Code Online (Sandbox Code Playgroud)

我意识到这对您的递归示例非常不方便,但更广泛的教训是,如果解决了问题,您应该转换该目录树中的所有文本文件,以便它们与您的系统字符编码兼容。如果您需要与 Windows 文本编辑器兼容,请不要担心,大多数专注于代码编辑的 Windows 文本编辑器都支持 UTF-8,尽管现在 Windows 本身就使用 UTF-16。

另一种可能性是您的文件使用了卷曲引号。您在键盘上键入的引号是直引号——ASCII 39——但一些文字处理器和文本编辑器将它们替换为卷引号,或者在本例中为U+2019

我喜欢使用此命令来查看文件以调查字符编码问题:

$ od -t x1 < myfile.txt | less
Run Code Online (Sandbox Code Playgroud)

有各种可用的“hexdump”程序,但它们经常做无用的事情,例如以小端格式将数据显示为 16 位字。因为od它不像任何像样的 hexdump 程序那样也有可打印的文本显示列,所以它最适合短文件。我经常将示例简化为易于测试的内容。