在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>
在文件中摆脱零。