
我有一個可執行文件,它會產生一個文字文件作為其輸出。問題是文字檔案帶有某種二進位檔案標誌。結果是這樣的:
$ grep "grep string" output_file.txt
Binary file output_file.txt matches.
$ grep -a "grep string" output_file.txt
[correct results]
一些閱讀表明 grep 在前一千個左右字節中查找空字符,然後從中確定文件是否是“二進制”,所以我的問題有兩個:
有沒有簡單的方法可以從我的文件中刪除空字元(我可以將其作為後處理的一部分)以確保 grep 在沒有 -a 標誌的情況下正常工作?
我應該在程式碼中查找一些明顯的內容以防止將空字元寫入文件嗎?我已經徹底檢查了程式碼,沒有發現任何明顯的罪魁禍首。
。
答案1
我至少可以回答第一個問題。如果您使用 Unix/Linux,則可以使用 tr
tr -d '\000' < filein > fileout
其中 \000 是空字元。您也可以刪除所有不可列印的字符,如範例所示:“Unix 文本編輯:sed、tr、cut、od、awk”
關於你的第二個問題,我不知道你的程式語言是什麼,但我會搜尋未初始化的變量,這些變數可能最終會列印到輸出檔案中。
答案2
我來猜測一下......
您的程式以 UTF-16 寫入文件,這是一種 Unicode 編碼,每個字元使用兩個位元組。大多數情況下,每隔一個位元組都是空值。
iconv -f utf-16 -t utf-8 < filein > fileout
會將其轉換為大多數 coreutils 都熟悉的 UTF-8。
答案3
另一個選擇可能是使用字串工具,它實際上比僅僅「修復」編碼或空字元更強大,它可以從任何真正的二進位檔案中獲取文字數據,所以
$ 字串輸出檔.txt | grep "grep 字串"
通常可以很方便地在二進位檔案中快速找到某些內容,例如
$ 字串韌體.bin |版本號