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
。
我有二进制文件,我想删除特定字节序列(五次“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
。