
Na indústria cinematográfica, é comum ter arquivos de áudio WAV contendo metadados no bloco iXML RIFF. Uma maneira fácil de ler esses metadados é abrir o arquivo WAV em um editor de texto, como BBEdit ou Notepad++ ou mesmo TextEdit. Mas com a linha de comando cat
ou tail
não funciona, só vejo caracteres inúteis. Estou usando o macOS 10.13, se for importante. Por que é cat
diferente desses aplicativos de edição de texto?
Aqui está um arquivo de exemplo, com o iXML na parte inferior:http://www.gallery.co.uk/ixml/examples/usesEntireiXMLSpec.WAV
Responder1
Quando cat
gera o arquivo, ele gera byte por byte como está, sem substituir espaços ou pontos ou algum outro tipo de caracteres de substituição. Portanto, quando ele gera os dados binários de amostra de áudio anteriormente no arquivo .WAV, alguns desses bytes correspondem aos códigos de controle de terminal da velha escola e "sequências de escape" (sequências de bytes começando com o caractere "ESC", que podem ser usado para fazer coisas como alterar o texto ou a cor de fundo, limpar a tela do terminal e reposicionar o cursor na tela do terminal). Seu emulador de terminal (Terminal.app ou iTerm2 ou qualquer outro) tenta respeitar esses códigos de controle e sequências de escape, o que altera a maneira como normalmente exibe o texto, e o faz de maneiras imprevisíveis.
Muitas ferramentas baseadas em terminal têm opções para permitir que você lide com arquivos que possuem alguns dados binários misturados com texto ASCII puro para impressão. Por exemplo, cat
tem a -v
opção de substituir sequências imprimíveis no lugar de caracteres de controle ASCII. Há também vis(1)
, od(1)
, e outros hexdump(1)
. strings(1)
Você também pode usar ferramentas como sed(1)
, grep(1)
e awk(1)
para tentar extrair os dados XML ASCII do meio dos dados binários do arquivo.
Dessas opções, acho strings(1)
que pode ser a mais promissora para você. Ele verifica o arquivo em busca de execuções (strings) ininterruptas de médio a longo prazo de caracteres ASCII imprimíveis e gera automaticamente todas as strings que encontrar. Portanto, como o XML é ASCII puramente imprimível, strings(1)
você deve imprimir tudo enquanto ignora todos os dados binários de áudio.