Почему командная строка cat отличается от BBEdit?

Почему командная строка cat отличается от BBEdit?

В киноиндустрии обычно есть аудиофайлы WAV, содержащие метаданные в фрагменте iXML RIFF. Один из простых способов прочитать эти метаданные — открыть файл WAV в текстовом редакторе, например BBEdit или Notepad++, или даже TextEdit. Но с командной строкой catэто tailне работает, я вижу только мусорные символы. Я использую macOS 10.13, если это имеет значение. Чем catотличается от этих приложений для редактирования текста?

Вот пример файла, в котором iXML находится в самом низу:http://www.gallery.co.uk/ixml/examples/usesEntireiXMLSpec.WAV

решение1

Когда catвыводит файл, он выводит его байт в байт как есть, без замены пробелов или точек или каких-либо других символов замены. Поэтому, когда он выводит двоичные данные аудиосэмпла ранее в файле .WAV, некоторые из этих байтов случайно совпадают со старыми кодами управления терминала и «escape-последовательностями» (последовательностями байтов, начинающимися с символа «ESC», которые можно использовать для таких действий, как изменение цвета текста или фона, очистка экрана терминала и перемещение курсора на экране терминала). Ваш эмулятор терминала (Terminal.app или iTerm2 или что-то еще) пытается соблюдать эти коды управления и escape-последовательности, что нарушает обычный способ отображения текста и делает это непредсказуемым образом.

Многие терминальные инструменты имеют опции, позволяющие вам работать с файлами, которые содержат двоичные данные, смешанные с чистым печатным текстом ASCII. Например, catесть -vопция, позволяющая ему заменять печатные последовательности вместо управляющих символов ASCII. Также есть vis(1), od(1), hexdump(1), strings(1)и другие. Вы также можете использовать такие инструменты, как sed(1), grep(1), и , awk(1)чтобы попытаться извлечь данные ASCII XML из двоичных данных в файле.

Из этих вариантов, я думаю, strings(1)это может быть наиболее многообещающим для вас. Он просматривает файл в поисках непрерывных серий (строк) средней и большой длины печатных символов ASCII и автоматически выводит любые такие строки, которые он находит. Так что, поскольку XML — это чисто печатный ASCII, strings(1)следует вывести все, пропуская все двоичные аудиоданные.

Связанный контент