2011-10-14 12 views
5

का उपयोग कर किसी XML फ़ाइल से अमान्य वर्णों को कैसे निकालें I सभी अमान्य वर्णों से छुटकारा पाना चाहते हैं; उदाहरण के लिए hexadecimal value 0x1A एक एक्सएमएल फ़ाइल से sed का उपयोग कर।
रेगेक्स और कमांड लाइन क्या है?
EDIT
अधिक प्रतिक्रिया प्राप्त करने की उम्मीद में पर्ल टैग जोड़ा गया। मैं एक लाइनर समाधान पसंद करते हैं।
संपादित
ये मान्य XML वर्ण
sed या perl

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

जैसे? यह एक बहुत व्यापक बयान है। स्पष्टीकरण – KevinDTimm

+0

@ केविन डीटीएमएम मेरा मतलब है '0x1A' हेक्साडेसिमल चरित्र का एक उदाहरण है जिसे मैं अपनी एक्सएमएल फ़ाइल – user841550

+0

से हटाना चाहता हूं, आपका मतलब पत्थर युग में 1 एएच की तरह है? इसके लिए बेहतर उपयोग करें। –

उत्तर

6

मान लिया जाये कि UTF-8 एक्सएमएल दस्तावेजों:

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

दूसरे संस्करण का उपयोग करके मुझे एक त्रुटि मिल रही है 'प्रतिस्थापन प्रतिस्थापन-पंक्ति 1 पर समाप्त नहीं हुआ।'। मैंने एक कॉपी पेस्ट किया और नई लाइनों को हटा दिया। – user841550

+0

@ user841550, फिक्स्ड। मुझे यकीन नहीं है कि एन्कोडेड रूप में बाइट्स की अनुमति है, लेकिन अगर आप कोशिश करना चाहते हैं तो मैंने इसे वहां रखा है। न्यूलाइन को हटाने की जरूरत नहीं है, बीटीडब्ल्यू। – ikegami

+0

यह एक अच्छा समाधान है। एक छोटा सा किनारा मामला जहां यह विफल रहता है (ओओएम): एक बड़ी फ़ाइल जिसमें केवल एक पंक्ति होती है। – miku

2

tr आदेश सरल हो जाएगा।

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

नोट ASCII वर्ण '0x1A' ऑक्टल मान '032', है तो हम इसके स्थान से tr उपयोग करते हैं: तो, की तरह कुछ प्रयास करें। सुनिश्चित नहीं है कि tr हेक्स पसंद करता है।

+0

से बहुत परिचित नहीं हैं, यह 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