我有这个数据文件,它应该是一个普通的 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'
,它表示,“将不在 space 和 tilde 之间的所有内容(分别为字符 0x20 和 0x7E)更改为空”。这也会去除制表符,但您可以在空格前插入制表符以包含它们(或任何其他特殊字符)。
“^@”是表示 NUL(也称为“ascii(0)”或“\0”)的一种方式。如果某些程序以天真的方式实现,它们也可能会将其视为文件结尾。
关于linux - 如何从二进制垃圾中清除数据文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6307866/