当我尝试在文件中搜索字符串时,结果不包括用单引号括起来的字符串。
例如:
grep -rn text folder/
结果不包括如下所示的字符串:
'text'
愿意告诉我我做错了什么吗?
更新:我刚刚用一个新文件测试了它,它起作用了!看起来它只发生在一个特定文件(一个 ruby 文件)中。也许它与编码有关?
答案1
您很可能遇到一些字符编码问题。您尝试 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
我意识到这对于您的递归示例来说非常不方便,但更广泛的教训是,如果这解决了问题,您应该转换该目录树中的所有文本文件,以便它们与您的系统字符编码兼容。如果您需要 Windows 文本编辑器兼容性,请不用担心,大多数专注于代码编辑的 Windows 文本编辑器都支持 UTF-8,尽管现在 Windows 本身使用 UTF-16。
另一种可能性是您的文件使用大引号。您在键盘上输入的引号是直引号 - ASCII 39 - 但某些文字处理程序和文本编辑器将它们替换为弯引号,或者U+2019在这个例子中。
我喜欢使用此命令来浏览文件以调查字符编码问题:
$ od -t x1 < myfile.txt | less
有各种可用的“hexdump”程序,但它们经常做无用的事情,例如以小端格式将数据显示为 16 位字。不过,因为od
它不像任何像样的十六进制转储程序那样具有可打印的文本显示列,所以它最适合短文件。我经常先将示例简化为易于测试的内容。