AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 407071
Accepted
João
João
Asked: 2017-11-26 20:02:47 +0800 CST2017-11-26 20:02:47 +0800 CST 2017-11-26 20:02:47 +0800 CST

csplit não reconhece o regexp fornecido

  • 772

Estou trabalhando neste arquivo grande ( DATA.DAT , ~900MB) que contém vários outros arquivos. É de um jogo de PS2.

Amostras de som (que estão no formato .AIFF ), exatamente o que procuro, compõem a maior parte de seu tamanho.

Depois de pesquisar na web por extratores .DAT do PS2 , descobri que eles dependem basicamente do desenvolvedor e, como esse jogo/ferramenta é bastante obscuro e não encontro muito sobre ele online, pensei em automatizar o processo sozinho.

Inspecionando o arquivo em um editor hexadecimal, encontrei alguns cabeçalhos .AIFF , clonei os pedaços para novos arquivos .AIFF e, sem nenhum trabalho adicional, eles podiam ser reproduzidos.

Depois de passar um tempo tirando a ferrugem do meu conhecimento MUITO limitado de bash e lendo perguntas semelhantes aqui, criei esta expressão:

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

(Estou no OSX usando coreutils, daí o prefixo g- no csplit)

Dado que os arquivos .AIFF começam com a string "FORM" e dado que basicamente todas as amostras no arquivo estão próximas umas das outras (espaçadas por quantidades desprezíveis de dados que não irão gerar ruído final indesejado nas amostras), pensei que o regexp

/FORM/

bastaria dividir os arquivos.

No entanto, cada arquivo dividido está sendo gerado com dados inúteis que ficam entre as amostras de som antes do cabeçalho .AIFF , tornando-o impossível de reproduzir.

Capturas de tela dos dados hexadecimais de uma amostra de som dividida abaixo:

divisão ruim

Esta amostra real começa aproximadamente na marca de 1500 bytes:

amostra

O que está fazendo essa expressão dividir os arquivos com um deslocamento?

osx csplit
  • 2 2 respostas
  • 808 Views

2 respostas

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2017-11-27T04:32:19+08:002017-11-27T04:32:19+08:00

    Csplit é um utilitário de texto. É baseado em linha. Um padrão /FORM/significa “uma linha contendo FORM”. Uma linha é uma sequência de bytes diferente de LF (alimentação de linha, também conhecida como nova linha, que pode ser escrita \n, ^J, …), seguida por um byte LF (ou pelo final do arquivo, com utilitários GNU). Assim, o “lixo” que você observa é o que quer que esteja entre o caractere LF anterior e a FORMsubstring.

    A página do manual e a --helpbreve descrição assumem que você já sabe o que o comando faz, então eles apenas mencionam “peças” sem explicação. Você precisa ler a documentação completa para obter uma descrição do que são as peças.

    Você não pode fazer o que quiser com csplit. Você pode fazer isso com GNU awk. (Outras versões do awk podem não ter os recursos necessários — suporte a separadores de registro arbitrários e manipulação de bytes nulos.) Não testado:

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

    Mas isso pode cortar em lugares espúrios se os dados compactados simplesmente contiverem os quatro bytes FORM. Isso pode ser bom o suficiente para uma operação única com revisão manual, mas seria melhor usar uma ferramenta com reconhecimento de formato se precisar de algo confiável.

    • 2
  2. J_H
    2017-11-26T22:38:41+08:002017-11-26T22:38:41+08:00

    Um utilitário baseado em texto não é apropriado para manipular arquivos binários.

    É provável que você obtenha melhores resultados com Lib/aifc , PySoundFile ou o aplicativo de linha de comando ffmpeg .

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve