我正在一个相当大的文件中寻找某个字符串:
$ ls -lh archivo.csv
-rw-rw-rw- 1 yo yo 723M Dec 10 10:46 archivo.csv
如果我使用grep
我发现结果没有出现,而只是表明文件中有一些:
$ grep "12345" archivo.csv
Binary file archivo.csv matches
所以看看有问题的文件类型,我发现它是......
$ file archivo.csv
archivo.csv: ISO-8859 text, with very long lines, with CRLF line terminators
我已使用以下命令将其转换为 UNIX dos2unix
:
$ dos2unix archivo.csv
dos2unix: converting file archivo.csv to Unix format...
但是问题还是出现了:
$ grep "12345" archivo.csv
Binary file archivo.csv matches
我后来注意到您grep
可以选择在二进制文件中搜索,即-a
:
$ grep -a "12345" archivo.csv
12345 esto es un test
嗯man grep
,它表明:
-a, --text
Process a binary file as if it were text;
this is equivalent to the --binary-files=text option.
但我仍然想知道,如何将此二进制文件转换为 ASCII?
实际上,所有文件都是二进制的(很明显),但是当我们给这种二进制编码一个 X 解释时,我们说它具有编码 X(或以 X 编码)。
在您的情况下,该文件不是二进制文件,它具有ISO-8859编码,因此您必须使用知道如何工作(理解)所述编码的工具。
该参数
-a
强制它grep
忽略某些不被解释为 ASCII 字符串的代码(例如\x0
)。因此,在您的情况下,您应该将所述文件转换为更适合您的工具的另一个文件,从逻辑上讲,有很多工具,但我最喜欢的是iconv,在您的情况下,它类似于(来自相同的参考)
(注意:您可以按照您的要求将其转换为 ASCII 而不是 utf,但是您可能会丢失原始文件中的信息,例如符号
§
)。例如,我们有这个文件
正如我们所见,它允许您正确查看和过滤而不会丢失信息。
最后,
dos2unix
在这种情况下 using 对您不起作用,因为该命令要求文件为纯文本,而您的文件没有该编码(请参阅dos2unix)。您要问的内容有点宽泛,因为对我而言,这取决于文件包含的内容以及我想从中提取的内容。如果它将
grep
二进制文件转换为文本的方式适合您,并且您不关心文件中的信息比它给您的信息多,则可以使用: