我有一个包含不需要的空字符的文本文件(ASCII NUL,\0
)。当我尝试在vi
中查看时,我看到^@
符号,在普通文本中交错。我怎么能:
确定文件中的哪些行包含空字符?我尝试过点击\0
和\x0
,但这不起作用。
删除空字符?在文件上运行strings
清理了它,但我只是想知道这是否是最好的方式?
答案 0 :(得分:102)
我会使用tr
:
tr < file-with-nulls -d '\000' > file-without-nulls
如果您想知道命令参数中间的输入重定向是否有效,那么确实如此。实际上,大多数shell都会识别并处理命令行中任何位置的I / O重定向(<
,>
,...)。
答案 1 :(得分:55)
使用以下sed命令删除文件中的空字符。
sed -i 's/\x0//g' null.txt
此解决方案将文件编辑到位,这在文件仍在使用时非常重要。传递-i'ext'会创建原始文件的备份,并添加'ext'后缀。
答案 2 :(得分:17)
大量不需要的NUL字符,比如每隔一个字节,表示该文件是以UTF-16编码的,并且您应该使用iconv
将其转换为UTF-8。
答案 3 :(得分:5)
我发现了以下内容,它打印出哪些行(如果有)包含空字符:
perl -ne '/\000/ and print;' file-with-nulls
此外,八进制转储可以告诉您是否存在空值:
od file-with-nulls | grep ' 000'
答案 4 :(得分:5)
如果文件中的行以\ r \ n \ n结尾,则可以删除\ n \ 000,然后将\ r替换为\ n。
tr -d '\n\000' <infile | tr '\r' '\n' >outfile
答案 5 :(得分:2)
以下是使用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?
答案 6 :(得分:1)
我用过:
recode UTF-16..UTF-8 <filename>
摆脱文件中的零。
答案 7 :(得分:0)
我在遇到同样的错误:
import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')
我通过将编码更改为utf-16
f=cd.open(filePath,'r','utf-16')