![为什么命令行 cat 与 BBEdit 不同?](https://linux22.com/image/1562963/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%91%BD%E4%BB%A4%E8%A1%8C%20cat%20%E4%B8%8E%20BBEdit%20%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
在电影行业中,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 文件中较早地输出二进制音频样本数据时,其中一些字节恰好与旧式终端控制代码和“转义序列”(以“ESC”字符开头的字节序列,可用于执行诸如更改文本或背景颜色、清除终端屏幕以及在终端屏幕内重新定位光标等操作)相匹配。您的终端仿真器(Terminal.app 或 iTerm2 或其他)会尝试遵守这些控制代码和转义序列,这会破坏它通常显示文本的方式,并且以不可预测的方式进行。
许多基于终端的工具都有一些选项,可让您处理包含一些二进制数据和纯可打印 ASCII 文本的文件。例如,有cat
一个-v
选项可使其用可打印序列代替 ASCII 控制字符。还有vis(1)
、、等。您还可以使用od(1)
、和等工具尝试从文件中的二进制数据中提取 ASCII XML 数据。hexdump(1)
strings(1)
sed(1)
grep(1)
awk(1)
在这些选项中,我认为strings(1)
对您来说可能是最有希望的。它会扫描整个文件,寻找中长不间断的可打印 ASCII 字符(字符串),并自动输出找到的任何此类字符串。因此,由于 XML 是纯可打印的 ASCII,因此strings(1)
应该将其全部打印出来,同时跳过所有二进制音频数据。