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

unix: delete everything before a sequence of bytes

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

对二进制文件使用 sed 不会有好的结果,因为它会做一些与区域设置和编码相关的事情,并且通常希望对文本文件起作用。还有另一个实用程序 bbe(二进制块编辑器),它更适合这项任务。有了它,你可以做到:

bbe -b ':/~~~~~/' -e 'D 1' test

这表明块是以 ~~~~~ 结尾的单元,并指示 bbe 删除第一个块 (D 1)。

您 运行 使用 sed 遇到的问题是 sed 逐行工作,打折编码混乱。如果您一心想用 sed 来做(在这种情况下您可能会遇到随机失败),这个 可能 在某些平台上工作:

sed '1,/~~~~~/ { /~~~~~/!d; s/^.*~~~~~// }' test

这将在模式范围 1,/~~~~~/ 中(从第一行到包含 ~~~~~ 的第一行)删除不包含 ~~~~~ 的行并删除部分~~~~~ 来自最终完成的行。这比 bbe 方法在多个方面更脆弱;除了编码混乱之外,如果 ~~~~~ 在两个 0a (换行符)字节之间出现两次,它将中断。 如果这是严肃用途,请选择 bbe