Por que o cat da linha de comando é diferente do BBEdit?

Por que o cat da linha de comando é diferente do BBEdit?

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 catou tailnão funciona, só vejo caracteres inúteis. Estou usando o macOS 10.13, se for importante. Por que é catdiferente 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 catgera 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, cattem a -vopçã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.

informação relacionada