2011-10-14 46 views
5

我想擺脫的所有無效字符刪除無效字符;示例hexadecimal value 0x1A來自使用sed的XML文件。
什麼是正則表達式和命令行?
編輯
新增Perl的標籤,希望得到更多的響應。我更喜歡單線解決方案。
編輯
這些都是有效的XML字符
如何從一個XML文件中使用SED或Perl

x9 | xA | xD | [x20-xD7FF] | [xE000-xFFFD] | [x10000-x10FFFF] 
+0

如?這是一個非常廣泛的聲明。澄清 – KevinDTimm

+0

@KevinDTimm我的意思是'0x1A'是,我想從我的XML文件中刪除十六進制字符的例子 – user841550

+0

你的意思是像1AH視爲在石器時代EOF標誌物?爲此更好地使用tr。 –

回答

6

假設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 
+0

使用第二個版本,我得到一個錯誤'替換替換未在-e行1結束.'。我做了一個複製粘貼並刪除了新行。 – user841550

+0

@ user841550,已修復。我不確定字節是否允許使用編碼形式,但如果您想嘗試,我會將其放在那裏。換行符不需要被移除,順便說一句。 – ikegami

+0

這是一個很好的解決方案。一個很小的邊緣情況下失敗(OOM):一個只包含一行的大文件。 – miku

2

tr命令會更簡單。所以,你可以試試:

cat <filename> | tr -d '\032' > <newfilename> 

需要注意的是ASCII字符「0X1A」的八進制值「032」,所以我們使用,而不是與tr。不確定tr是否喜歡十六進制。

+0

當其他解決方案(包括使用iconv)都沒有工作時,它可以工作100%。謝謝! – Dan

0

嘗試:

perl -pi -e 's/[^\x9\xA\xD\x20-\x{d7ff}\x{e000}-\x{fffd}\x{10000}-\x{10ffff}]//g' file.xml 
+0

您將字節與絕對不適合字節的值匹配。 – ikegami

相關問題