大容量バイナリファイルをコンテキストモードで決定された部分に分割する

大容量バイナリファイルをコンテキストモードで決定された部分に分割する

次の大容量(2GB)ファイルがあります。

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

^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^は区切り記号です。バイナリセグメントが大きい。アーカイブには約50個あります。

ファイルのバイナリ部分を抽出しようとしています。各バイナリセグメントは独自のファイルに移動する必要があります。

使ってみましたがcsplit

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

しかし、次の出力と2つのout??ファイルを受け取りました。

1
2097951144

これを行うことができるツールがあります(csplitバイナリを処理できる実装ですか?)

答え1

これを行うために小さなPythonツールを作成しました。https://github.com/mypalmike/csplitb

csplitb.py --prefix X --suffix Y --number Z XXXXXXXX input-file.extension
X= 名前で始まる出力ファイル名
はい=希望の出力ファイル拡張子
=出力ファイルを区別するために使用されるビット数
XXXXXXXXX=入力ファイルから分割する各バイナリファイルの開始16進数
入力ファイル。拡張子=ファイル分割中

例:
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

textが最初に表示されたときにファイルを分割するようにcsplitに指示します^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^。したがって、自然に2つの部分で終わります。 1つはファイルの最初のバイト(最初の区切り文字の前に改行またはスペースがありますか?)を含み、もう1つは最初の区切り文字から始まるすべてを含みます。

別々のファイルに分割するには、フラグメントから1を引いた回数だけこのパターンを繰り返す必要があります。移植可能な場合は、断片化を計算する必要があります。

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

GNUには、csplitパターンを無制限に繰り返すことができる拡張機能があります。

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

ただし、区切り文字が出力に含まれているため、必要に応じて実行されません。後でファイルから削除できます。パターン区切り文字の%代わりにファイルの末尾に区切り文字を使用するように配置する方が簡単です。しかし、csplitは可愛いですが、ユースケースが非常に狭く、あなたのケースがそれに適していないという事実を受け入れることをお勧めします。より適切なツールを使用してください/csplit … '%\^\%\%-=-=-=-=-=-=-=-=-=-=-=-=-=-\%\%\^% {*}'awkのような

関連情報