csplit erkennt bereitgestellten regulären Ausdruck nicht

csplit erkennt bereitgestellten regulären Ausdruck nicht

Ich arbeite an dieser großen Datei (DATEN.DAT, ~900 MB), das mehrere andere Dateien enthält. Es stammt aus einem PS2-Spiel.

Klangbeispiele (die in.AIFFFormat), genau das, was ich suche, machen den größten Teil seiner Größe aus.

Nach der Suche im Internet nach PS2.DATExtraktoren habe ich herausgefunden, dass sie grundsätzlich vom Entwickler abhängig sind, und da dieses Spiel/Tool eher obskur ist und man online nicht viel darüber findet, habe ich darüber nachgedacht, den Prozess selbst zu automatisieren.

Als ich die Datei mit einem Hex-Editor überprüfte, stieß ich auf einige.AIFFHeader, klonte die Chunks in neue.AIFFDateien und ohne weitere Arbeit waren sie abspielbar.

Nachdem ich eine Weile damit verbracht hatte, meine SEHR begrenzten Bash-Kenntnisse auszutrocknen und hier ähnliche Fragen gelesen hatte, kam ich auf diesen Ausdruck:

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

(Ich verwende Coreutils auf OSX, daher das Präfix „g-“ bei csplit)

Angesichts dessen.AIFFDateien beginnen mit der Zeichenfolge "FORM" und da im Grunde alle Samples in der Datei nebeneinander liegen (durch vernachlässigbare Datenmengen voneinander getrennt, die kein unerwünschtes Endrauschen auf den Samples erzeugen), dachte ich, dass der reguläre Ausdruck

/FORM/

würde ausreichen, die Dateien aufzuteilen.

Allerdings wird jede geteilte Datei mit Junk-Daten ausgegeben, die zwischen den Sound-Samples liegen, bevor die.AIFFHeader, wodurch es nicht abgespielt werden kann.

Screenshots der Hex-Daten eines geteilten Sound-Samples unten:

schlechte Aufteilung

Dieses tatsächliche Beispiel beginnt ungefähr bei der 1500-Byte-Marke:

Probe

Was bewirkt dieser Ausdruck, dass die Dateien mit einem Offset aufgeteilt werden?

Antwort1

Csplit ist ein Textdienstprogramm. Es ist zeilenbasiert. Ein Muster /FORM/bedeutet „eine Zeile, die enthält FORM“. Eine Zeile ist eine Folge von Bytes außer LF (Zeilenvorschub, auch bekannt als Newline, kann als \n, ^J, … geschrieben werden), gefolgt von einem LF-Byte (oder dem Ende der Datei mit GNU-Dienstprogrammen). Der „Müll“, den Sie beobachten, ist also alles, was sich zwischen dem vorherigen LF-Zeichen und der FORMTeilzeichenfolge befindet.

Die Manpage und die --helpKurzbeschreibung setzen voraus, dass Sie bereits wissen, was der Befehl tut, daher wird dort nur von „Stücken“ ohne Erklärung gesprochen. Sie müssen dievollständige Dokumentationum eine Beschreibung der Stücke zu erhalten.

Mit csplit können Sie nicht machen, was Sie wollen. Mit GNU awk geht das. (Andere Versionen von awk verfügen möglicherweise nicht über die erforderlichen Funktionen – Unterstützung beliebiger Datensatztrennzeichen und Umgang mit Nullbytes.) Ungetestet:

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

Dies kann jedoch an falschen Stellen zu Schnitten führen, wenn die komprimierten Daten zufällig die vier Bytes enthalten FORM. Für einen einmaligen Vorgang mit manueller Überprüfung mag das ausreichend sein, aber wenn Sie etwas Zuverlässiges benötigen, sind Sie mit einem formatfähigen Tool besser bedient.

Antwort2

Ein textbasiertes Dienstprogramm ist nicht zum Bearbeiten von Binärdateien geeignet.

Bessere Ergebnisse erzielen Sie wahrscheinlich mitLib/aicf,PySoundFile, oder derffmpegBefehlszeilen-App.

verwandte Informationen