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

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

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

例如:

grep -rn text folder/

结果不包括如下所示的字符串:

'text'

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

更新:我刚刚用一个新文件测试了它,它起作用了!看起来它只发生在一个特定文件(一个 ruby​​ 文件)中。也许它与编码有关?

答案1

您很可能遇到一些字符编码问题。您尝试 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

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

另一种可能性是您的文件使用大引号。您在键盘上输入的引号是直引号 - ASCII 39 - 但某些文字处理程序和文本编辑器将它们替换为弯引号,或者U+2019在这个例子中。

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

$ od -t x1 < myfile.txt | less

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

相关内容