2011-03-21 13 views
17

मैं एक एक्सएमएल फ़ाइल है, जो मुझे इस तरह उत्पादन देता grepping हूँ:यूनिक्स कमांड लाइन से एक्सएमएल टैग कैसे निकालें?

<tag>data</tag> 
<tag>more data</tag> 
... 

ध्यान दें, यह एक फ्लैट फ़ाइल, नहीं एक XML का पेड़ है। मैं एक्सएमएल टैग को हटाना चाहता हूं और डेटा को बीच में प्रदर्शित करना चाहता हूं। मैं आदर्श रूप में कमांड लाइन से यह सब कर रहा हूँ और अगर वहाँ awk में इसे दो बार पाइप की तुलना में एक बेहतर तरीका है सोच रहा था ...

cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}' 

, मैं एक आदेश में ऐसा करने के लिए करना चाहते हैं

+0

* * "मैं एक एक्सएमएल फ़ाइल grepping हूँ" - * "यह एक फ्लैट फ़ाइल, नहीं एक XML पेड़ है" * - अब, फाइल अच्छी तरह से गठित एक्सएमएल है या नहीं? – Tomalak

+0

शायद मैं थोड़ा स्पष्ट किया जाना चाहिए था - यह एक अच्छी तरह से गठन एक्सएमएल फ़ाइल है, लेकिन एक बार मैं इसे ग्रेप के माध्यम से पहुंचाया गया है यह अब एक XML वृक्ष संरचना है, यह अनिवार्य रूप से एक फ्लैट फ़ाइल है। – Tarski

+0

आह, अब यह मुझे समझ में आता है।वैसे भी मैंने एकेड किया है क्योंकि * क्लीन * संस्करण जीएसपी/sed के माध्यम से एक्सएसएलटी के माध्यम से इस एक्सएमएल फ़ाइल को पास करना होगा। मैं एक एक्सएसएलटी जवाब लिखूंगा लेकिन ऐसा लगता है कि आपने अपना जहर उठा लिया है। :-) – Tomalak

उत्तर

32

आपकी फ़ाइल बस ऐसे ही लग रहा है, तो sed आप मदद कर सकते हैं:

sed -e 's/<[^>]*>//g' file.xml 
पाठ्यक्रम you should not use regular expressions for parsing XML because it's hard के

+2

धन्यवाद। जी – Tarski

+0

संपादित करने के बाद कृपया बंद करने के लिए संपादित करें। आपका स्वागत है। – Johnsyweb

+0

एचटीएमएल में टैग की सफाई के लिए सहायक कमांड! धन्यवाद! – p1nesap

4

का उपयोग awk:

awk '{gsub(/<[^>]*>/,"")};1' file.xml 
+0

एचटीएमएल पेज परीक्षण पर, परिणाम sed (ऊपर) के समान दिखते हैं। अजीब विधि पोस्ट करने के लिए धन्यवाद! – p1nesap

1

इस आजमाएँ:

grep -Po '<.*?>\K.*?(?=<.*?>)' inputfile 

स्पष्टीकरण:

पर्ल कम्पैटिबल रेगुलर एक्सप्रेशन (-P) और outputting केवल निर्दिष्ट मैचों (-o) का उपयोग करना:

  • <.*?> - कोण कोष्ठक के भीतर किसी भी पात्रों में से गैर लालची मैच
  • \K - उत्पादन में पिछले मैच शामिल न करें (मैच शुरू रीसेट - सकारात्मक के समान लुक-पीछे है, लेकिन यह चर लंबाई से मेल खाता है के साथ काम करता है)
  • .*? - गैर लालची (उत्पादन इस हिस्से हो जाएगा) मैच अगले मैच पर रोक
  • (?=<.*?>) - कोण कोष्ठक के भीतर किसी भी पात्रों में से गैर लालची मैच और उत्पादन में मैच शामिल नहीं हैं (सकारात्मक look- आगे - चर लंबाई के साथ काम करता से मेल खाता है)
+0

यह केवल लिनक्स पर काम करेगा, क्योंकि ओएसएक्स '-पी' ध्वज हटा दिया गया है। – kenorb

+0

@kenorb: ध्यान दें कि जीएनयू उपयोगिता ओएस एक्स के लिए उपलब्ध हैं। उदाहरण के लिए [होमब्रू] (http://brew.sh/) का उपयोग करना। –

1

उपयोग html2text कमांड लाइन उपकरण है, जो सादे पाठ में एचटीएमएल बदल देता है।

ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt 

या:

वैकल्पिक रूप से आप ex -तरह की कोशिश कर सकते

cat file.txt | ex -s +'%s/<[^>].\{-}>//ge' +%p +q! /dev/stdin 
0

मैं जानता हूँ कि यह एक "perlgolf प्रतियोगिता" नहीं है, लेकिन मैं इस चाल का उपयोग करते थे।

सेट रिकॉर्ड सेपरेटर < या > के लिए, उसके बाद ही अजीब लाइनों प्रिंट:

awk -vRS='<|>' NR%2 file.xml 
संबंधित मुद्दे