linux - 如何从二进制垃圾中清除数据文件?

标签 linux perl file binary

我有这个数据文件,它应该是一个普通的 ASCII 文件。但是,它在第​​一行的末尾有一些垃圾。它仅在我使用 vi 或更少的情况下查看时显示 -->

  y mon d  h XX11 XX22 XX33 XX44 XX55 XX66^@
2011  6 6 10 14.0 15.5 14.3 11.3 16.2 16.1

grep 还说它是一个二进制文件:Binary file data.dat matches

这在我的解析脚本中造成了一些问题。我正在拆分每一行并将它们放入数组。第一个数组中的最后一个元素 (XX66) 不知何故已损坏,因为垃圾,我无法匹配它。

如何清理那条线或数组?我已尝试对文件使用 dos2unix 并将数组成员替换为 s/\s+$//。那到底是什么垃圾?不幸的是,我无法控制这些数据,它是第三方数据。

有什么想法吗?

最佳答案

Grep 试图变聪明,当它看到不可打印的字符时,会切换到“二进制”模式。添加“-a”或“--text”以强制 grep 保持“文本”模式。

至于sed,试试sed -e 's/\([^ -~]*\)//g' ,它表示,“将不在 spacetilde 之间的所有内容(分别为字符 0x20 和 0x7E)更改为空”。这也会去除制表符,但您可以在空格前插入制表符以包含它们(或任何其他特殊字符)。

“^@”是表示 NUL(也称为“ascii(0)”或“\0”)的一种方式。如果某些程序以天真的方式实现,它们也可能会将其视为文件结尾。

关于linux - 如何从二进制垃圾中清除数据文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6307866/

相关文章:

linux - 网络上所有机器的主机名发现

perl - 如何将命名迭代器与后缀 foreach 一起使用?

c - 如果程序使用 ctrl + c 停止,则日志记录失败

c - 如何将文件中的字符串列表读取到动态二维数组中,然后在 C 中对其进行排序

android - 如何在我的 Mac 和 Linux 开发机器上使用 ADT

Linux FTP : Operation now in progress after restart/put

java - 通过管道将输入输入到 Bash 中的 Java 程序

windows - perl 的 rmtree() 无法删除 win32 上的目录,第二次尝试成功

html - 有趣且延迟的 WebSocket

python - 如何在模块中的函数内使用模块的位置 - python