在UNIX中识别和删除空字符

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

  1. 确定文件中哪些行包含空字符? 我已经尝试了\0\x0 ,但是这不起作用。

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

我会使用tr

 tr < file-with-nulls -d '\000' > file-without-nulls 

如果你想知道在命令参数中间inputredirect是否有效, 实际上,大多数shell会识别和处理命令行中任何地方的I / Oredirect( <> ,…)。

使用以下sed命令删除文件中的空字符。

 sed -i 's/\x0//g' null.txt 

此解决scheme编辑文件到位,重要的是如果该文件仍在使用中。 传递-i'ext'创build了一个添加了'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然后用\ nreplace\ r将起作用。

 tr -d '\n\000' <infile | tr '\r' '\n' >outfile 

下面是如何使用ex (in-place)去除NULL字符的例子:

 ex -s +"%s/\%x00//g" -cwq nulls.txt 

和多个文件:

 ex -s +'bufdo!%s/\%x00//g' -cxa *.txt 

对于recursion,可以使用**/*.txt (如果支持并启用扩展匹配)。

由于sed及其-i参数是一个非标准的BSD扩展,所以对于脚本很有用。

另请参阅: 如何检查文件是否是二进制文件并读取所有不是的文件?

我用了:

 recode UTF-16..UTF-8 <filename> 

在文件中摆脱零。