csplitは提供された正規表現を認識しません。

csplitは提供された正規表現を認識しません。

私はこの大容量ファイルを扱っています(データ。DAT、〜900 MB)これには他のいくつかのファイルが含まれています。 PS2ゲームからの内容です。

サウンドサンプル(位置:.AIFF形式)これは私が求めている形式で、サイズの大部分を占めています。

PS2をオンラインで検索した後.DAT私は彼らが基本的に開発者に依存していることを知り、このゲーム/ツールはかなり曖昧で、オンラインでそれに関する多くの情報を見つけることができないので、プロセスを直接自動化しようとしています。

Hex Editorでファイルをスキャン中にいくつかの問題が見つかりました。.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 (newline とも呼ばれ、 ^J, … で書ける newline) 以外のバイトシーケンスであり、その後\nには LF バイト (または GNU ユーティリティを使用する場合ファイルの末尾に) があります。したがって、観察された「ゴミ」は、FORM以前のLF文字と部分文字列の間のすべてです。

マニュアルページと--help簡単な説明では、コマンドが何をしているのかを既に知っていると仮定しているので、説明なしで「断片」だけに言及しています。あなたは読まなければなりません完全な文書その部分の説明を確認してください。

csplitではあなたが望むことはできません。 GNU awkを使用してこれを行うことができます。 (他のバージョンのawkには、任意のレコード区切り文字やNULLバイト処理のサポートなど、必要な機能がない可能性があります。)

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

ただし、圧縮データに正確に4バイトが含まれていると、FORM誤った場所で切り捨てられる可能性があります。これは手動チェックのワンタイムタスクには十分ですが、信頼できるものが必要な場合はフォーマット認識ツールを使用することをお勧めします。

おすすめ記事