我遇到了将文本文件标记为二进制文件的问题

我遇到了将文本文件标记为二进制文件的问题

我有一个可执行文件,它生成一个文本文件作为其输出。问题是文本文件带有某种二进制文件标志。结果如下:

$ grep "grep string" output_file.txt
Binary file output_file.txt matches.

$ grep -a "grep string" output_file.txt
[correct results]

一些阅读表明 grep 在前一千个左右的字节中寻找空字符,然后由此确定文件是否为“二进制”,所以我的问题有两个方面:

  1. 有没有一种简单的方法可以从我的文件中删除空字符(我可以将此作为后期处理的一部分来执行此操作)以确保 grep 在没有 -a 标志的情况下正常工作?

  2. 我应该在代码中寻找一些明显的东西来防止将空字符写入文件吗?我已经仔细检查了代码,没有发现任何明显的罪魁祸首。

答案1

我至少可以回答第一个问题。如果你使用Unix/Linux,你可以使用tr

tr -d '\000' < filein > fileout

其中 \000 是空字符。您还可以删除所有不可打印的字符,如下例所示:“Unix 文本编辑:sed、tr、cut、od、awk”

关于您的第二个问题,我不知道您的编程语言是什么,但我会搜索可能最终被打印到输出文件的未初始化变量。

答案2

我要猜一下……

您的程序以 UTF-16 格式写入文件,UTF-16 是 Unicode 的一种编码,每个字符使用两个字节。大多数情况下,第二个字节为空。

iconv -f utf-16 -t utf-8 < filein > fileout

将其转换为 UTF-8,这是大多数核心实用程序所熟悉的。

答案3

另一种选择是使用字符串工具,实际上它比仅仅“修复”编码或空字符更强大,它可以从任何真实的二进制文件中获取文本数据,因此

$ 字符串 output_file.txt | grep “grep 字符串”

通常很方便在二进制文件中快速查找某些内容,例如

$ 字符串固件.bin | grep 版本

相关内容