unix:删除字节序列之前的所有内容

时间:2015-01-08 14:04:19

标签: regex sed binary

我有二进制文件,我想删除(包括)某个字节序列(五次'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/.*~~~~~//'尝试了它,但它只删除了'~~~~~'并保留了其余部分。

1 个答案:

答案 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