我有一个包含不需要的空字符的文本文件(ASCII NUL,\0
)。当我尝试在vi
中查看它时,我看到^@
符号,在普通文本中交错。我怎么能够:
\0
和\x0
进行捣蛋,但这不起作用。strings
清理它,但我只是想知道这是否是最好的方法?我会用tr
:
tr < file-with-nulls -d '\000' > file-without-nulls
如果您想知道命令参数中间的输入重定向是否有效,那么确实如此。实际上,大多数shell将在命令行的任何地方识别并处理I / O重定向(<
,>
,...)。
使用以下sed命令删除文件中的空字符。
sed -i 's/\x0//g' null.txt
此解决方案将文件编辑到位,这在文件仍在使用时很重要。传递-i'ext'创建原始文件的备份,并添加'ext'后缀。
大量不需要的NUL字符,比如说每隔一个字节,表示文件是用UTF-16编码的,你应该使用iconv
将其转换为UTF-8。
我发现了以下内容,它打印出哪些行(如果有)包含空字符:
perl -ne '/\000/ and print;' file-with-nulls
此外,八进制转储可以告诉您是否存在空值:
od file-with-nulls | grep ' 000'
如果文件中的行以\ r \ n \ 000结尾,则可以删除\ n \ 000,然后将\ r替换为\ n。
tr -d '\n\000' <infile | tr '\r' '\n' >outfile
以下是如何使用ex
(就地)删除NULL字符的示例:
ex -s +"%s/\%x00//g" -cwq nulls.txt
对于多个文件:
ex -s +'bufdo!%s/\%x00//g' -cxa *.txt
对于递归,您可以使用globbing option **/*.txt
(如果您的shell支持)。
由于sed
及其-i
参数是非标准的BSD扩展,因此对脚本很有用。
另见:How to check if the file is a binary file and read all the files which are not?
我用了:
recode UTF-16..UTF-8 <filename>
摆脱文件中的零。
我遇到了同样的错误:
import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')
我通过将编码更改为utf-16
解决了这个问题
f=cd.open(filePath,'r','utf-16')