我有一个大(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。