将大型二进制文件拆分为由上下文模式确定的部分

将大型二进制文件拆分为由上下文模式确定的部分

我有一个大(2GB)文件,如下所示:

^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^
<binary data>
^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^ 
<binary data>
^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^
<binary data>
...

线条^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^是分隔符。二进制段很大。档案里大约有五十个。

我正在尝试提取该文件的二进制部分。每个二进制段都需要进入其自己的文件中。

我尝试使用csplit

csplit --digits=2 --prefix=out stu.ear '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/'

但收到以下输出和两个out??文件,

1
2097951144

是否有一个工具可以完成这项工作(csplit也许是一个可以处理二进制文件的实现?)

答案1

我写了一个Python小工具来做到这一点。https://github.com/mypalmike/csplitb

csplitb.py --prefix X --suffix Y --number Z XXXXXXXX input-file.extension
X= 输出文件名开头的名称
= 所需的输出文件扩展名
Z= 用于区分输出文件的位数
XXXXXXXXX=要从输入文件中拆分出来的每个二进制文件的起始十六进制
输入文件.扩展名= 正在分割的文件

例子:
csplitb.py --prefix photo --suffix .png --number 4 89504e47 block-file.raw

输出:

photo0000.png
photo0001.png
photo0002.png
.............

答案2

以下将起作用:

      awk '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/{n++}{print >"out" n ".ear" }

答案3

您告诉 csplit 在文本第一次出现的一个位置拆分文件^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^。因此,您自然会得到两部分:一个包含文件的第一个字节(第一个分隔符之前是否有换行符或空格?),另一个包含从第一个分隔符开始的所有内容。

如果您想分割成单独的文件,则必须重复该模式多次,只要您想要的片段减一即可。可移植的是,您需要计算碎片。

csplit --digits=2 --prefix=out stu.ear '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/'"{$(grep -c '\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^' stu.ear)}"

GNUcsplit有一个扩展,可以让你无限次地重复某个模式:

csplit --digits=2 --prefix=out stu.ear '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/ {*}'

但这并没有达到您想要的效果,因为分隔符包含在输出中。您可以稍后将其从文件中删除;如果您安排在文件末尾使用分隔符%而不是/作为模式分隔符(因此csplit … '%\^\%\%-=-=-=-=-=-=-=-=-=-=-=-=-=-\%\%\^% {*}'),则会更容易一些。但您不妨接受这样一个事实:csplit 虽然很可爱,但用例非常狭窄,而您的不适合。使用更适合的工具比如 awk

相关内容