如何使用 sed 删除空字节?

Chr*_*vey 44 sed

sed从文件中删除空字节的咒语是什么?我想:

s/\000//g
Run Code Online (Sandbox Code Playgroud)

但这是剥离零字符串。

s/\x00//g
Run Code Online (Sandbox Code Playgroud)

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

Tam*_*man 54

我不知道您如何使用 来实现这一点sed,但这是一个适用于tr以下的解决方案:

tr < file-with-nulls -d '\000' > file-without-nulls
Run Code Online (Sandbox Code Playgroud)

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

sed 's/\x0//g' file1 > file2
Run Code Online (Sandbox Code Playgroud)

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

sed 's/\x0/ /g' file1 > file2
Run Code Online (Sandbox Code Playgroud)

  • 这看起来是一个非常不完整的答案。为什么它在某些情况下有效,而在其他情况下无效,如果是这样,那么示例就没有用了吗? (10认同)
  • 那么这对我来说听起来不错,所以你说这取决于 SED 的实施。如果您没有说过您会保留开放的可能建议,即 SED 的一种实现可能会从一个文件而不是另一个文件中删除空值,具体取决于文件中的数据。 (4认同)
  • 不应该是 "tr -d '\000' &lt; file-with-nulls &gt; file-without-nulls" 吗? (3认同)

kqw*_*kqw 8

tr绊倒了我文件中的其他一些字节并且sed没有替换任何内容。我最终不是sed用 Python 而是用 Python 完成的:

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

这是一个可管道的单衬里:

python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("\0", ""))'
Run Code Online (Sandbox Code Playgroud)

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


Fli*_*imm 6

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

$ printf 'one\0two\0' | perl -np -e 's/\0/\n/g'
one
two
Run Code Online (Sandbox Code Playgroud)

使用该-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
Run Code Online (Sandbox Code Playgroud)

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