在UNIX中标识和删除空字符

问题描述 投票:76回答:8

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

  1. 确定文件中的哪些行包含空字符?我曾尝试过为\0\x0进行捣蛋,但这不起作用。
  2. 删除空字符?在文件上运行strings清理它,但我只是想知道这是否是最好的方法?
unix shell null special-characters
8个回答
102
投票

我会用tr

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

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


55
投票

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

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

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


17
投票

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


5
投票

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

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

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

od file-with-nulls | grep ' 000'

5
投票

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

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

2
投票

以下是如何使用ex(就地)删除NULL字符的示例:

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

对于多个文件:

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

对于递归,您可以使用globbing option **/*.txt(如果您的shell支持)。

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

另见:How to check if the file is a binary file and read all the files which are not?


1
投票

我用了:

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

摆脱文件中的零。


0
投票

我遇到了同样的错误:

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

我通过将编码更改为utf-16解决了这个问题

f=cd.open(filePath,'r','utf-16')
© www.soinside.com 2019 - 2024. All rights reserved.