我想擺脫的所有無效字符刪除無效字符;示例hexadecimal value 0x1A
來自使用sed的XML文件。
什麼是正則表達式和命令行?
編輯
新增Perl的標籤,希望得到更多的響應。我更喜歡單線解決方案。
編輯
這些都是有效的XML字符
如何從一個XML文件中使用SED或Perl
x9 | xA | xD | [x20-xD7FF] | [xE000-xFFFD] | [x10000-x10FFFF]
我想擺脫的所有無效字符刪除無效字符;示例hexadecimal value 0x1A
來自使用sed的XML文件。
什麼是正則表達式和命令行?
編輯
新增Perl的標籤,希望得到更多的響應。我更喜歡單線解決方案。
編輯
這些都是有效的XML字符
如何從一個XML文件中使用SED或Perl
x9 | xA | xD | [x20-xD7FF] | [xE000-xFFFD] | [x10000-x10FFFF]
假設UTF-8 XML文檔:
perl -CSDA -pe'
s/[^\x9\xA\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+//g;
' file.xml > file_fixed.xml
如果你想編碼壞字節而不是,
perl -CSDA -pe'
s/([^\x9\xA\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}])/
"&#".ord($1).";"
/xeg;
' file.xml > file_fixed.xml
你可以調用它幾不同的方式:
perl -CSDA -pe'...' file.xml > file_fixed.xml
perl -CSDA -i~ -pe'...' file.xml # Inplace with backup
perl -CSDA -i -pe'...' file.xml # Inplace without backup
使用第二個版本,我得到一個錯誤'替換替換未在-e行1結束.'。我做了一個複製粘貼並刪除了新行。 – user841550
@ user841550,已修復。我不確定字節是否允許使用編碼形式,但如果您想嘗試,我會將其放在那裏。換行符不需要被移除,順便說一句。 – ikegami
這是一個很好的解決方案。一個很小的邊緣情況下失敗(OOM):一個只包含一行的大文件。 – miku
的tr
命令會更簡單。所以,你可以試試:
cat <filename> | tr -d '\032' > <newfilename>
需要注意的是ASCII字符「0X1A」的八進制值「032」,所以我們使用,而不是與tr
。不確定tr
是否喜歡十六進制。
當其他解決方案(包括使用iconv)都沒有工作時,它可以工作100%。謝謝! – Dan
嘗試:
perl -pi -e 's/[^\x9\xA\xD\x20-\x{d7ff}\x{e000}-\x{fffd}\x{10000}-\x{10ffff}]//g' file.xml
您將字節與絕對不適合字節的值匹配。 – ikegami
如?這是一個非常廣泛的聲明。澄清 – KevinDTimm
@KevinDTimm我的意思是'0x1A'是,我想從我的XML文件中刪除十六進制字符的例子 – user841550
你的意思是像1AH視爲在石器時代EOF標誌物?爲此更好地使用tr。 –