2013-02-19 21 views
6

मेरे पास निम्न फ़ाइल log.xml:xmlstarlet - दूर करने linefeed

<entry> 
    <message>Line 1 
    Line 2 and so on</message> 
</entry> 

CentOS 5.4 पर, xmlstarlet 1.0.1 अगर मैं निम्नलिखित कमांड चलाएँ का उपयोग करते समय message में linefeed को हटाने:

xml sel -t -m //entry -v "translate(message,'&#xa;' ,'@')" log.xml 

परिणाम है:

Line [email protected] Line 2 and so on 

xmlstarlet का उपयोग कर CentOS 6 पर 0:

1.3.1 
compiled against libxml2 2.7.6, linked with 20706 
compiled against libxslt 1.1.26, linked with 10126 

मैं प्राप्त करेंगे:

Line 1 
    Line 2 nd so on 

नोट "और" कुछ भी नहीं करने के लिए परिवर्तित। मुझे लगता है कि यह xmlstarlet की समस्या नहीं है, बल्कि libxslt में कुछ बदलाव है।

कोई विचार इसे ठीक करने के लिए कैसे करें?

अद्यतन

जोड़ा गया पत्र "एक" कुछ नहीं के बदलने के साथ समस्या।

+0

:

तब का अनुवाद समारोह के दूसरे तर्क के रूप में है कि चर का उपयोग http://stackoverflow.com/a/6651469/825783 प्रासंगिक हो सकता है। –

+0

@EeroHelenius यह सुनिश्चित नहीं है कि यह वही समस्या है :( – dimba

+0

निश्चित रूप से पता नहीं है, लेकिन शायद लाइन की समाप्ति आपके अपेक्षा से अलग है: http: // sourceforge।net/mailarchive/message.php? msg_id = 28142284 –

उत्तर

6

आप एक चर एक लाइन ब्रेक का मूल्य युक्त परिभाषित करते हुए एक सामान्य तरीके से इस का समाधान कर सकते हैं:

xml sel -t -m //entry 
     --var linebreak -n --break 
     -v "translate(message, \$linebreak ,'@')" 
     log.xml 
1

मैं xmlstarlet के बारे में पता नहीं है, लेकिन आप Xidel की कोशिश कर सकते:

xidel log.xml -e '//message/translate(., $line-ending, "@")' 

मैं इंजन क्वेरी करने के लिए, तो यह कोई निर्भरता है और सभी सिस्टम पर एक ही व्यवहार करती है पार्सर से इसके बारे में सब लिखा है,।

3

&#xa; केवल एक न्यूलाइन वर्ण का प्रतिनिधित्व करता है जब XPath अभिव्यक्ति स्वयं एक्सएमएल फ़ाइल (जैसे एक्सएसएलटी स्टाइलशीट) में होती है। मुझे लगता है यहाँ क्या हो रहा है कि जब आप कमांड लाइन पर कहते हैं कि

translate(message,'&#xa;' ,'@') 

, '&#xa;' एक पांच चरित्र स्ट्रिंग के रूप में इलाज किया जा रहा है, और इस तरह आप @ साथ & को बदलने के लिए translate कह रहे हैं और यह भी सभी को बदलने के लिए है #, x, a और ; कुछ भी नहीं के साथ।

का उपयोग कर Ctrl-V एक शाब्दिक न्यू लाइन का प्रयास करें

xml sel -t -m //entry -v "translate(message,'<ctrl-V><CR>' ,'@')" log.xml 

(अर्थात ctrl-वी गाड़ी वापसी के बाद जब आदेश टाइप - यह ^M के रूप में अपने स्क्रीन पर दिखाई देगा)।

+0

आप सही हैं - 5 अक्षरों के रूप में व्याख्या किया गया। समाधान आपने – dimba

+0

@ डिम्बा काम नहीं करने का प्रस्ताव दिया है, मैं एक चर का उपयोग करके पाब्लो के उत्तर के साथ जाऊंगा। –