在UNIX中标识和删除空字符

时间:2010-03-07 23:12:34

标签: unix shell null special-characters

我有一个包含不需要的空字符的文本文件(ASCII NUL,\0)。当我尝试在vi中查看时,我看到^@符号,在普通文本中交错。我怎么能:

  1. 确定文件中的哪些行包含空字符?我尝试过点击\0\x0,但这不起作用。

  2. 删除空字符?在文件上运行strings清理了它,但我只是想知道这是否是最好的方式?

8 个答案:

答案 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')