為什麼命令列 cat 與 BBEdit 不同?

為什麼命令列 cat 與 BBEdit 不同?

在電影產業中,WAV 音訊檔案在 iXML RIFF 區塊中包含元資料是很常見的。讀取此元資料的簡單方法是在文字編輯器(如 BBEdit 或 Notepad++ 甚至 TextEdit)中開啟 WAV 檔案。但是使用命令列cattail它不起作用,我只看到垃圾字元。如果有必要的話,我正在使用 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)hexdump(1)strings(1)等。您也可以使用sed(1)grep(1)、 和等工具awk(1)嘗試從檔案中的二進位資料中提取 ASCII XML 資料。

在這些選項中,我認為strings(1)對您來說可能是最有希望的。它掃描文件,查找可列印 ASCII 字元的中長不間斷運行(字串),並自動輸出它找到的任何此類字串。因此,由於 XML 是純粹可列印的 ASCII,因此strings(1)應將其全部列印出來,同時跳過所有二進位音訊資料。

相關內容