Text-Processing
處理以 BOM (FF FE) 開頭的文件
我收到了一個帶有
FF FE
BOM 的 .csv 文件:$ head -n1 dotan.csv | hd 00000000 ff fe 41 00 64 00 20 00 67 00 72 00 6f 00 75 00 |..A.d. .g.r.o.u.|
當
awk
用來解析它時,我得到一堆空字節,我懷疑這是由於字節順序造成的。如何交換此文件的字節順序(使用 CLI),以便普通工具可以使用它?請注意,我認為這個文件只是 ASCII 字元(BOM 除外),但我無法確認它
grep
認為它是二進製文件:$ grep -P '^[\x00-\x7f]' dotan.csv Binary file dotan.csv matches
在 VIM 中搜尋相同的字元串會顯示每個字元匹配!
使用
iconv
轉換為 ASCII 並沒有擺脫 \x00 值,實際上它使問題變得更糟,因為現在它們看起來像空字節而不是 UTF-8!$ iconv -f UTF-8 -t ASCII dotan.csv > fixed.txt iconv: illegal input sequence at position 0 $ iconv -f UTF-8 -t ASCII//IGNORE dotan.csv > fixed.txt $ head -n1 fixed.txt | hd 00000000 41 00 64 00 20 00 67 00 72 00 6f 00 75 00 70 00 |A.d. .g.r.o.u.p.|
如何交換此文件的字節順序(使用 CLI),以便普通工具可以使用它?
從這篇維基百科文章中,
FF FE
意思是UTF16LE
。所以你應該告訴iconv
從轉換UTF16LE
為UTF8
:iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt
dos2unix
還刪除 BOM 並將 UTF-16 轉換為 UTF-8:$ printf %s あ|recode ..utf16 >a;xxd -p a;dos2unix a;xxd -p a feff3042 dos2unix: converting file a to Unix format... e38182
dos2unix
還刪除了 UTF-8 BOM:$ printf %b '\xef\xbb\xbfa'>a;dos2unix a;xxd -p a dos2unix: converting file a to Unix format... 61