Por que o gato de linha de comando é diferente do BBEdit?

0

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 até mesmo TextEdit. Mas com a linha de comando cat ou tail não funciona, apenas vejo caracteres de lixo. 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 amostra, com o iXML todo na parte inferior: link

    
por Elliott B 09.06.2018 / 01:11

1 resposta

2

Quando cat produz o arquivo, ele gera byte-by-by-como-é sem substituir espaços ou pontos ou algum outro tipo de caracteres de substituição. Portanto, quando os dados de amostra de áudio binários são exibidos anteriormente no arquivo .WAV, alguns desses bytes correspondem aos códigos de controle do terminal da velha escola e "seqüê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 cor de fundo, limpar a tela do terminal e reposicionar o cursor dentro da tela do terminal). Seu emulador de terminal (Terminal.app ou iTerm2 ou qualquer outro) tenta honrar esses códigos de controle e seqüências de escape, o que gera a forma como normalmente exibe texto, e faz isso de maneiras imprevisíveis.

Várias 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 imprimível puro. Por exemplo, cat tem uma opção -v para fazer com que substitua sequências imprimíveis no lugar de caracteres de controle ASCII. Há também vis(1) , od(1) , hexdump(1) , strings(1) e outros. 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 no arquivo.

Destas opções, acho que strings(1) pode ser o mais promissor para você. Ele varre o arquivo procurando por execuções ininterruptas de média a longa duração (strings) de caracteres ASCII imprimíveis e gera automaticamente as cadeias de caracteres que encontrar. Portanto, como o XML é puramente imprimível em ASCII, strings(1) deve imprimir tudo ao mesmo tempo em que ignora todos os dados de áudio binários.

    
por 09.06.2018 / 21:43