在UNIX中识别和删除空字符


98

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

  1. 确定文件中的哪几行包含空字符?我曾尝试对\0和进行grepping \x0,但这没有用。

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


1
这种问题可能属于SuperUser.com
Olivier Lalonde 2010年

2
事实上,这个问题在superuser.com上:superuser.com/questions/75130/how-to-to-remove-ths-symbol-with-vim
jrb

Answers:


130

我会用tr

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

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


和“差异文件为空的文件,无空”应显示哪些行具有空字符?它带来了比预期更多的收益。
dogbane

10
实际上,我认为应该这样做,tr -d '\000' < file-with-nulls > file-without-nulls因为它<是外壳管道功能的一部分,而不是tr
Mikael S'3

9
实际上,大多数shell都会在参数字符串中的任何位置识别并处理<或>。我也很惊讶
PRA

1
+1用于代替输入重定向cat |。一个好的,干净的解决方案,它解决了我的问题。
2014年

4
@pointy'\ 000'代替tr的POSIX开放组规范中的'\ 0'。那是选择它的一个很好的理由
哈罗德·菲舍尔

67

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

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

此解决方案可在适当位置编辑文件,如果该文件仍在使用中,则很重要。传递-i'ext'将添加后缀'ext'来创建原始文件的备份。


6
注意:在FreeBSD(我相信也是Mac OS X)中,在下一个参数中sed -i 需要扩展名,但它可能为空。在这些系统中,添加'',例如:sed -i '' 's/\x0//g "$FILE"
TimČas17年

1
这比tr我快一个数量级
diachedelic '17

对我而言,使用Windows版Git和$ sed --version-> sed (GNU sed) 4.7,我必须使用以下调用来获取名为example.csv.bak:的备份文件:sed -i.bak 's/\x0//g' example.csv
Andrew Keeton

1
@TimČas你做得很好,只是错过了一个',所以它应该被sed -i''s / \ x0 // g'some_file.xml
Darko

@Darko所以我做到了。哎呀。
蒂姆·恰斯(TimČas)

22

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


1
我的应用程序正在记录时,我的磁盘空间不足。这导致了这些字符。
dogbane

例如,它的工作原理使用这个命令:iconv -f UTF-16 -t UTF-8 file
djule5

7

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

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

PS。如果发现自己在Windows DOS外壳中,则可以从Sourceforge.net获得GNU / win32版本的Unix命令。我一直都在用它们。


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')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.