在UNIX中识别和删除空字符
我有一个包含不需要的空字符(ASCII NUL, \0 )的文本文件。 当我尝试在vi查看它时,我看到^@符号,以正常文本交错。 我怎么能够: 
- 
确定文件中哪些行包含空字符? 我已经尝试了 \0和\x0,但是这不起作用。
- 
删除空字符? 在文件上运行 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> 
在文件中摆脱零。