我有二进制文件,我想删除(包括)某个字节序列(五次'7e')之前的所有内容。例如,我有一个文件测试:
hexdump test
0000000 000a 4ffa 0a0d 7e7e 7e7e 837e 646f 0110
0000010 8318 dac3
0000014
结果应为:
hexdump test1
0000000 6f83 1064 1801 c383 00da
0000009
我用cat test | sed 's/.*~~~~~//'
尝试了它,但它只删除了'~~~~~'并保留了其余部分。
答案 0 :(得分:0)
将sed与二进制文件一起使用并不会很好,因为它会做一些与语言环境和编码相关的事情,并且通常希望处理文本文件。还有另一个实用程序bbe
(二进制块编辑器),它更适合此任务。有了它,你可以这样做:
bbe -b ':/~~~~~/' -e 'D 1' test
这表明块是以~~~~~
结尾的单位,并指示bbe
删除其中的第一个(D 1
)。
你遇到的问题是sed,折扣编码snafu,是sed逐行工作。如果你非常喜欢使用sed(在这种情况下可以预期随机失败),这个可能在某些平台上运行:
sed '1,/~~~~~/ { /~~~~~/!d; s/^.*~~~~~// }' test
这将在模式范围1,/~~~~~/
中(从第一行到包含~~~~~
的第一行)删除不包含~~~~~
的行,并将部分删除到{{ 1}}从最终的行。这比~~~~~
方法更加脆弱,而不是一种方式;除了编码snafu之外,如果bbe
在两个~~~~~
(换行符)字节之间出现两次,它将会中断。 如果需要认真使用,请使用0a
。