在UNIX中标识和删除空字符

dog*_*ane 84 unix shell null special-characters

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

  1. 确定文件中的哪些行包含空字符?我曾尝试grepping为\0\x0,但没有奏效.

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

Poi*_*nty 113

我用的是tr:

tr < file-with-nulls -d '\000' > file-without-nulls
Run Code Online (Sandbox Code Playgroud)

如果您想知道命令参数中间的输入重定向是否有效,那么确实如此.大部分炮弹将认识和处理I/O重定向(<,>,...)在命令行中的任何地方,其实.

  • 实际上,我认为它应该是`tr -d'\'000'<file-with-nulls> file-without-nulls`,因为`<`是shell管道功能的一部分,而不是`tr`. (10认同)
  • 实际上,大多数shell会在参数字符串中的任何地方识别和处理<或>.也让我很惊讶. (9认同)
  • @Pointy'\ 000'用于代替tr的POSIX opengroup规范中的'\ 0'.这是喜欢它的一个很好的理由 (3认同)

rek*_*sri 59

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

sed -i 's/\x0//g' null.txt
Run Code Online (Sandbox Code Playgroud)

此解决方案将文件编辑到位,这在文件仍在使用时很重要.传递-i'ext'创建原始文件的备份,并添加'ext'后缀.

  • 注意:在FreeBSD中(我也相信Mac OS X),`sed -i`*在下一个参数中需要*扩展名,但它可能是空的.在这些系统中,添加一个`'',如:`sed -i''s /\x0 // g"$ FILE"`. (4认同)
  • 对我来说,这比 `tr` 快一个数量级 (2认同)

Ign*_*ams 18

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


dog*_*ane 6

我发现了以下内容,它打印出哪些行(如果有)包含空字符:

perl -ne '/\000/ and print;' file-with-nulls
Run Code Online (Sandbox Code Playgroud)

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

od file-with-nulls | grep ' 000'
Run Code Online (Sandbox Code Playgroud)


wwm*_*bes 5

如果文件中的行以\ r \n\000结尾,则可以删除\n\000,然后将\ r替换为\n.

tr -d '\n\000' <infile | tr '\r' '\n' >outfile
Run Code Online (Sandbox Code Playgroud)