如何使用 sed 删除空字节?

如何使用 sed 删除空字节?

sed从文件中删除空字节的咒语是什么?我正在尝试:

s/\000//g

但这会删除零串。

s/\x00//g

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

答案1

我不知道您如何能够准确地实现这一点sed,但这是一个适用于的解决方案tr

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

这是一个sed适用于以下部分(但不是全部)实现的解决方案sed

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

这是一个涉及替换空格字符的解决方案,它应该适用于所有场合:

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

答案2

tr在我的文件中遇到了一些其他字节,但sed并没有替换任何内容。我最终在sedPython 中而不是在 中完成了此操作:

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

答案4

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

[^\x01-\x7F]

相关内容