Identifying and removing null characters in UNIX

I have a text file containing unwanted null characters (ASCII NUL, \0). When I try to view it in vi I see ^@ symbols, interleaved in normal text. How can I:

  1. Identify which lines in the file contain null characters? I have tried grepping for \0 and \x0, but this did not work.

  2. Remove the null characters? Running strings on the file cleaned it up, but I'm just wondering if this is the best way?

154518 次浏览

我会用 tr:

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

如果您想知道命令参数中间的输入重定向是否有效,那么它确实有效。实际上,大多数 shell 将识别并处理命令行中任何地方的 I/O 重定向(<>、 ...)。

大量不需要的 NUL 字符(比如每隔一个字节一个)表明文件是用 UTF-16编码的,应该使用 iconv将其转换为 UTF-8。

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

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

此解决方案在适当的位置编辑文件,如果文件仍在使用,则这一点很重要。Pass-i‘ ext’创建原始文件的备份,并添加“ ext”后缀。

我发现了以下内容,它打印出哪些行(如果有的话)具有 null 字符:

perl -ne '/\000/ and print;' file-with-nulls

此外,八进制转储可以告诉您是否存在空值:

od file-with-nulls | grep ' 000'

Here is example how to remove NULL characters using ex (in-place):

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

以及多个文件:

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

对于递归性,可以使用 球状选项**/*.txt(如果您的 shell 支持的话)。

对脚本非常有用,因为 sed及其 -i参数是非标准的 BSD 扩展。

参见: 如何检查该文件是否为二进制文件,并读取所有不是二进制文件的文件?

我用:

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

去掉文件中的零。

如果文件中的行以 r n 000结束,那么可行的方法是删除 n 000,然后将 r 替换为 n。

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

我在以下方面也犯了同样的错误:

import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')

I solved the problem by changing the encoding to utf-16

f=cd.open(filePath,'r','utf-16')

使用 PHP 删除 PDF 文件末尾的空字符,这与操作系统无关

这个脚本使用 PHP 删除二进制文件末尾的 NULL 值,解决了由 NULL 值触发的崩溃问题。您可以编辑这个脚本来删除所有的 NULL 字符,但是看到它完成一次将帮助您理解它是如何工作的。

背景故事
我们收到了来自第三方的 PDF,我们需要上传到我们的系统使用 PDF 库。在发送给我们的文件中,有一个空值,有时会被附加到 PDF 文件中。当我们的系统处理这些文件时,带有尾随 NULL 值的文件导致系统崩溃。

Originally we were using sed but sed behaves differently on Macs and Linux machines. We needed a platform independent method to extract the trailing null value. Php was the best option. Also, it was a PHP application so it made sense :)

该脚本执行以下操作:

取二进制文件,将其转换为 HEX (二进制文件不喜欢爆炸的新行或回车) ,爆炸的字符串使用回车作为分隔符,弹出数组的最后一个成员,如果值为空,内爆的数组使用回车,处理文件。

//In this case we are getting the file as a string from another application.
// We use this line to get a sample bad file.
$fd = file_get_contents($filename);


//We trim leading and tailing whitespace and convert the string into hex
$bin2hex = trim(bin2hex($fd));


//We create an array using carriage return as the delminiter
$bin2hex_ex = explode('0d0a', $bin2hex);


//look at the last element.  if the last element is equal to 00 we pop it off
$end = end($bin2hex_ex);
if($end === '00') {
array_pop($bin2hex_ex);
}


//we implode the array using carriage return as the glue
$bin2hex = implode('0d0a', $bin2hex_ex);


//the new string no longer has the null character at the EOF
$fd = hex2bin($bin2hex);