如何使用sed删除空字节?


37

sed从文件中删除空字节的意图是什么?我尝试着:

s/\000//g

但这就是去除零的字符串。

s/\x00//g

似乎没有效果。我正在尝试在sed脚本中执行此操作,因此我不确定该echo技巧是否有效。

Answers:


40

我不知道您如何使用来实现此目标sed,但这是可以使用的解决方案tr

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

这是一种sed在某些情况下但并非在所有情况下都适用的解决方案:

sed 's/\x0//g' file1 > file2

此解决方案涉及将空格字符替换为在所有情况下均适用的空格:

sed 's/\x0/ /g' file1 > file2

10
答案似乎很不完整。为什么它在某些情况下会起作用,而在另一些情况下却不会,如果是这样,那么一个例子就没有用吗?
barlop 2011年

@barlop:因为实现方式?OP没有指定一个,我也不会列举每一个实现...
Tamara Wijsman,

4
好吧,这对我来说听起来不错,所以您要说这取决于SED的实现。如果您没有说过自己没有打开,可能的建议是,SED的一种实现可能会从一个文件而不是另一个文件中删除空值,具体取决于文件中的数据。
barlop 2011年

3
它不应该是“ tr -d'\ 000'<file-with-nulls> file-without-nulls”吗?
Seamus Abshere

1
为我工作™。也很有用:-i用于将文件转换到位的参数。
zbyszek '16

8

tr绊倒了我文件中的其他一些字节,sed没有替换任何东西。我最终不是sed在Python中执行此操作:

f = open('file-with-0bytes.dump')
for l in f.readlines():
  print l.replace("\0", '')

这是一个可传递管道的单线

python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("\0", ""))'

我还注意到有些命令实际上将空字节保留在那里,但是它们不再可见,至少在OSX终端中不可见。我曾经hexdump调试过。


3

使用Perl执行正则表达式非常容易。只需替换sedperl -np -e

$ printf 'one\0two\0' | perl -np -e 's/\0/\n/g'
one
two

使用该-n选项,正则表达式会像sed一样逐行运行。

如果要使用零字节作为记录分隔符,请使用Perl的-0选项。

$ printf 'one\0two\0' | perl -np0 -e 's/^/prefix /; s/\0/\n/g'
prefix one
prefix two
$ printf 'one\0two\0' | perl -np -e 's/^/prefix /; s/\0/\n/g'
prefix one
two

您可以通过运行查找Perl的命令行选项perldoc perlrun


1

为了匹配一个空字节,我将此正则表达式与Cygwin的SED结合使用:

[^ \ x01- \ x7F]


这是GNUWin32上sed问题的答案。实际上,它去除的不仅仅是空值。根据您要匹配的内容和sed的实现,它可能对您不起作用。
Itsme2003 '18
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.