csplit は指定された正規表現を認識しません

csplit は指定された正規表現を認識しません

私はこの大きなファイルに取り組んでいます(データ.DAT、約 900 MB) で、他のいくつかのファイルが含まれています。これは PS2 ゲームからのものです。

サウンドサンプル(.AIFFまさに私が求めているのは、ファイル形式(つまり、ファイルサイズ)であり、これがそのサイズの大部分を占めています。

ウェブでPS2を検索した後.DAT抽出ツールは基本的に開発者に依存していることがわかりました。このゲーム/ツールはあまり知られておらず、オンラインでもあまり見つからないため、自分でプロセスを自動化することを考えました。

16進エディタでファイルを調べると、.AIFFヘッダー、チャンクを新しいものに複製した.AIFFファイルをアップロードし、それ以上の作業なしで再生できるようになりました。

非常に限られた bash の知識を磨くのにしばらく時間を費やし、ここで同様の質問を読んだ後、次の表現を思いつきました。

gcsplit -f "sample-" -b "%04d.aif" DATA.DAT /FORM/ '{*}'

(私は OSX で coreutils を使用しているため、csplit に g- プレフィックスが付いています)

とすれば.AIFFファイルは文字列「FORM」で始まり、ファイル内のサンプルは基本的にすべて隣り合っている(サンプルに不要なノイズを生成しない程度のデータ間隔を置いている)ので、正規表現は

/FORM/

ファイルを分割するだけで十分です。

しかし、分割されたファイルはすべて、サウンドサンプルの間にジャンクデータが入って出力され、.AIFFヘッダーが破損し、再生できなくなります。

以下は分割サウンド サンプルの 16 進データのスクリーンショットです。

悪い分割

この実際のサンプルは、およそ 1500 バイトのマーク付近から始まります。

サンプル

この式はなぜオフセットでファイルを分割するのでしょうか?

答え1

Csplit はテキスト ユーティリティです。行ベースです。パターンは/FORM/「 を含む行FORM」を意味します。行は、LF (ライン フィード、または改行とも呼ばれ、 、^J などと表記されます) 以外のバイトのシーケンスで\n、その後に LF バイト (または GNU ユーティリティの場合はファイルの末尾) が続きます。したがって、観察される「ジャンク」は、前の LF 文字と部分文字列の間にあるものになりますFORM

マニュアルページと--help短い説明では、コマンドが何をするかをすでに知っていることを前提としているため、説明なしで「ピース」についてのみ言及しています。完全なドキュメント作品が何であるかの説明を得るため。

csplit では、望むことはできません。GNU awk では可能です。(awk の他のバージョンには、任意のレコード区切り文字のサポートや null バイトへの対処など、必要な機能がない可能性があります。) 未テスト:

gawk -v RS='FORM' -v ORS='' '{
    print "FORM" $0 >sprintf("sample-%04d.aif", n++)
}' DATA.DAT

しかし、圧縮されたデータにたまたま 4 バイトが含まれている場合、この方法では不要な箇所がカットされる可能性がありますFORM。これは、手動で確認する 1 回の操作には十分かもしれませんが、信頼性の高いものが必要な場合は、フォーマットを認識するツールを使用する方がよいでしょう。

答え2

テキストベースのユーティリティはバイナリ ファイルの操作には適していません。

より良い結果が得られる可能性が高いリブ/aifcPyサウンドファイル、 またはffmpegコマンドラインアプリ。

関連情報