csplit no reconoce la expresión regular proporcionada

csplit no reconoce la expresión regular proporcionada

Estoy trabajando en este archivo grande (DATOS.DAT, ~900 MB) que contiene varios archivos más. Es de un juego de PS2.

Muestras de sonido (que están en.AIFFformato), precisamente lo que busco, ocupan la mayor parte de su tamaño.

Después de buscar en la web PS2.DATextractores Descubrí que dependen básicamente del desarrollador y dado que este juego/herramienta es bastante oscuro y no encuentro mucho sobre él en línea, pensé en automatizar el proceso yo mismo.

Al inspeccionar el archivo en un editor hexadecimal, encontré algunos.AIFFencabezados, cloné los fragmentos a nuevos.AIFFarchivos y sin ningún trabajo adicional, eran reproducibles.

Después de pasar un tiempo sacando el óxido de mi conocimiento MUY limitado de bash y después de leer preguntas similares aquí, se me ocurrió esta expresión:

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

(Estoy en OSX usando coreutils, de ahí el prefijo g- en csplit)

Dado que.AIFFLos archivos comienzan con la cadena "FORM" y dado que básicamente todas las muestras del archivo están una al lado de la otra (espaciadas por cantidades insignificantes de datos que no generarán ruido final no deseado en las muestras), pensé que la expresión regular

/FORM/

Sería suficiente dividir los archivos.

Sin embargo, cada archivo dividido se genera con datos basura que se encuentran entre muestras de sonido antes del.AIFFencabezado, haciéndolo injugable.

Capturas de pantalla de los datos hexadecimales de una muestra de sonido dividida a continuación:

mala división

Este ejemplo real comienza aproximadamente alrededor de la marca de 1500 bytes:

muestra

¿Qué hace que esta expresión divida los archivos con un desplazamiento?

Respuesta1

Csplit es una utilidad de texto. Está basado en líneas. Un patrón /FORM/significa "una línea que contiene FORM". Una línea es una secuencia de bytes distintos de LF (avance de línea, también conocido como nueva línea, que puede escribirse \n, ^J,…), seguido de un byte LF (o del final del archivo, con utilidades GNU). Por lo tanto, la "basura" que observa es lo que hay entre el carácter LF anterior y la FORMsubcadena.

La página de manual y la --helpbreve descripción asumen que ya sabes lo que hace el comando, por lo que solo mencionan "piezas" sin explicación. Necesitas leer eldocumentación completapara obtener una descripción de cuáles son las piezas.

No puedes hacer lo que quieras con csplit. Puedes hacerlo con GNU awk. (Es posible que otras versiones de awk no tengan las características requeridas: soporte de separadores de registros arbitrarios y manejo de bytes nulos). No probado:

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

Pero esto puede afectar a lugares falsos si los datos comprimidos contienen los cuatro bytes FORM. Esto puede ser lo suficientemente bueno para una operación única con revisión manual, pero sería mejor que tuviera una herramienta compatible con el formato si necesita algo confiable.

Respuesta2

Una utilidad basada en texto no es apropiada para manipular archivos binarios.

Es probable que obtenga mejores resultados conLib/aifc,PySoundFile, o elffmpegaplicación de línea de comando.

información relacionada