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
并没有替换任何内容。我最终在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 执行正则表达式非常简单。只需将其替换sed
为perl -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]