2012-05-28 5 views
8

मैं grep का उपयोग कर एक XML फ़ाइल में जानकारी खोजने के लिए लिनक्स शैल स्क्रिप्ट पर काम कर रहा हूं। मैं एक मैक पर हूं जो मुझे उम्मीद है कि इससे कोई फर्क नहीं पड़ता।grep का उपयोग कर xml टैग के अंदर जानकारी कैसे प्राप्त करें?

जानकारी की आवश्यकता ढूंढने के लिए, मैं चलाएँ:

grep -oP "<title>(.*)</title>" temp.xml 

मैं मिलान की सूची बदले में मिलता है और इस <title> टैग शामिल है।

मैं कैसे title टैग लेकिन ग्रेप का उपयोग कर title टैग के बिना अंदर केवल जानकारी के साथ एक सूची प्राप्त कर सकते हैं?

+1

क्यों आप XPath बजाय का उपयोग नहीं करते में सुझाव दिया xpath का उपयोग कर xgrep स्थापित कर सकता है? – toniedzwiedz

+0

इसे एक त्वरित पटकथा नौकरी होना है, मैं इस पर उम्र बिताना नहीं चाहूंगा। क्या आप एक अच्छा xpath कमांड लाइन उपकरण की सिफारिश कर सकते हैं? – Filype

+0

ऐसा लगता है कि मुझे पहले से ही xpath5.12 इंस्टॉल किया गया है।कोई मैन्युअल प्रविष्टि हालांकि – Filype

उत्तर

3

मैं नहीं देख सकते हैं कि आप इस के लिए ग्रेप का उपयोग करना चाहते हैं, यह हो सकता है, जबकि एक छोटी सी XPath अभिव्यक्ति के साथ हल:

//title/text() 

XPath के लिए कई कमांड लाइन औजार हैं और वे आमतौर पर ओएस के साथ बंडल कर रहे हैं।

this question on Stack Overflow के उत्तर इस तरह के कई उपकरणों की सूची।

grep के साथ समस्या यह है कि यह टेक्स्ट प्रोसेसिंग के लिए एक सामान्य उपकरण है और यह किसी भी XML संरचना से अवगत नहीं है। एक बहुत ही सरल परिदृश्य के लिए, आप get it working कर सकते हैं। यदि दस्तावेज़ जटिल है या यदि आप इसे किसी स्क्रिप्ट में उपयोग कर रहे हैं जो महीनों या वर्षों तक जीवित रहेगा, न सिर्फ एक-एक नौकरी के लिए, आप परिणामों के लिए खेद महसूस कर सकते हैं।

XPath दस्तावेज़ में विभिन्न संदर्भों में दिखाई देने वाले समान नाम वाले टैग के बीच अंतर बताना आसान बनाता है।

<article> 
    <author> 
     <name>Jon Doe</name> 
     <title>Chief Editor</title> 
    </author> 
    <title>On the Benefits of grep</title> 
    <publicationDate>2018-02-12</publicationDate> 
    <text>blah blah blah</text> 
</article> 

लेख grep के साथ इस दस्तावेज़ का प्रतिनिधित्व करती विफल हो जाएगा यदि आप अन्य उत्तर यहां पोस्ट के किसी भी उपयोग किया जाता है के शीर्षक निकाला जा रहा है। आप जो चाहते हैं उसे पाने के लिए तकनीकी रूप से नियमित अभिव्यक्ति लिख सकते हैं लेकिन XPath के साथ यह बहुत आसान है।

/article/title/text() 

आप जानते हैं कि आप एक छोटी सी दस्तावेज़ के साथ काम कर रहे हैं और प्रारूप में परिवर्तन नहीं होता या अगर यह एक बार काम जहाँ आप शीघ्रता से परिणाम को मान्य कर सकते है, आप के रूप में दूसरों के द्वारा समझाया grep के लिए जा सकते हैं।

+0

XPath का समर्थन करने वाले आदेशों के उदाहरण xgrep (http://wohlberg.net/public/software/xml/xgrep), xmlgrep (http://search.cpan.org/dist/XML-Twig/tools/xml_grep/xml_grep हैं) या sgrep (http://www.cs.helsinki.fi/u/jjaakkol/sgrep.html)। – Claudix

+2

आप (स्पष्ट) प्रश्न में क्या समझ नहीं पाए जो "grep का उपयोग कर" के साथ समाप्त होता है? – Moonchild

+1

ओपी द्वारा किए गए धारणाओं के विरोध में समस्या के मूल को संबोधित करने वाले प्रश्न के उपयोगी उत्तर प्रदान करने वाले उत्तर में आपको क्या समझ में नहीं आया। यह आपको परेशान क्यों कर रहा है? – toniedzwiedz

2

यह नहीं सबसे अच्छा समाधान है, मैं पार्टी में XML lib के लिए खोज करेंगे, लेकिन आप कर सकते हैं:

grep -oP "<title>(.*)</title>" temp.xml | cut -d ">" -f 2 | cut -d "<" -f 1 
+0

यह भी मेरे लिए मेरा समाधान है। – Filype

14

चूंकि आप पहले से ही grep -P का उपयोग करते हैं, तो आप इसकी सुविधाओं का उपयोग क्यों नहीं करते?

grep -oP '(?<=<title>).*?(?=</title>)' 

सामान्य स्थिति में, XPath सही समाधान है, लेकिन खिलौनों के परिदृश्यों के लिए, हाँ वर्जीनिया, यह किया जा सकता है।

+0

लेकिन अब grep -P अप्रचलित है – Bharat

+1

@ भारत अप्रचलित ?? क्या आप एक संदर्भ प्रदान कर सकते हैं? – tripleee

+0

मैंने पाया कि [यहां] (http://stackoverflow.com/questions/16658333/grep-p-no-longer-works-how-can-i-rewrite-my-searches) – Bharat

संबंधित मुद्दे