识别和删除Unix中的空字符

cngwdvgl  于 2022-09-21  发布在  Unix
关注(0)|答案(8)|浏览(185)

我有一个包含不需要的空字符(ASCII nul、\0)的文本文件。当我试图在vi中查看它时,我看到了交错在普通文本中的^@符号。我如何:

1.确定文件中哪些行包含空字符?我尝试过对\0\x0执行GREGING,但这不起作用。
1.是否删除空字符?在文件上运行strings会将其清除,但我只是想知道这是不是最好的方法?

at0kjp5o

at0kjp5o1#

我会使用tr

tr < file-with-nulls -d '000' > file-without-nulls
  • 如果您想知道命令参数中间的输入重定向是否有效,它确实有效。大多数外壳程序将识别和处理I/O重定向(<>、…)实际上,在命令行中的任何位置。*
eiee3dmh

eiee3dmh2#

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

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

此解决方案可就地编辑文件,如果文件仍在使用,这一点很重要。传递-I‘ext’将创建添加了‘ext’后缀的原始文件的备份。

shyt4zoc

shyt4zoc3#

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

fbcarpbf

fbcarpbf4#

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

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

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

od file-with-nulls | grep ' 000'
pjngdqdw

pjngdqdw5#

如果文件中的行以\r\n\000结尾,那么有效的方法是删除\n\000,然后用\n替换。

tr -d 'n000' <infile | tr 'r' 'n' >outfile
kxeu7u2r

kxeu7u2r6#

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

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

对于多个文件:

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

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

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

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

ohfgkhjo

ohfgkhjo7#

我使用:

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

去掉文件中的零。

l2osamch

l2osamch8#

我也犯了同样的错误:

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

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

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

相关问题