5 grep
当我尝试在文件中搜索字符串时,结果不包括用单引号括起来的字符串。
例如:
grep -rn text folder/
Run Code Online (Sandbox Code Playgroud)
结果不包括看起来像这样的字符串:
'text'
Run Code Online (Sandbox Code Playgroud)
介意告诉我我做错了什么吗?
更新:我刚刚用一个新文件对其进行了测试,并且成功了!看起来它只发生在一个特定的文件(一个 ruby 文件)中。也许它与编码有关?
您很有可能会遇到一些字符编码问题。您尝试 grep 的文件的字符编码可能与系统的默认编码不同。如今,Unixy 系统通常默认使用 UTF-8,它与 7 位 ASCII 兼容,但不与任何 8 位 ASCII 扩展兼容。美国常见的 8 位编码是ISO 8859-1和Windows 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 程序那样也有可打印的文本显示列,所以它最适合短文件。我经常将示例简化为易于测试的内容。