2 टैग के बीच टेक्स्ट निकालने के लिए sed का उपयोग करना


16

मेरे पास एक .xml फ़ाइल है और मैं RHEL6 मशीन पर एक "Groupinstall" करने की कोशिश कर रहा हूं क्योंकि उस .xml फ़ाइल में कई सौ पुस्तकालय हैं ... (16 000 लाइनों के करीब)।

इसलिए मैं .xml फ़ाइल में सम्‍मिलित समूह नामों को निकालने की कोशिश कर रहा हूँ जिनमें यह संरचना है:

<b>
<group>
<id> group name </id>
   <packages>
   ...
   </packages>
<id> group name 2 </id>
   <packages>
   ...
   </packages>
<id> etc... </id>
</group>
</b>

मूलतः, यह वही है जो मैंने कोशिश की है:

sed -n '/<id>/,/<\/id>/p' test1.txt > test2.txt

मैंने .xml फ़ाइल को test1.txt पर कॉपी किया। मैं test1.txt से एक दूसरी फ़ाइल test2.txt नामक समूह के नाम निकालने की कोशिश कर रहा हूं। हालाँकि, ऊपर दी गई लाइन के साथ, यह FIRST <id>टैग से </id>मेरी फ़ाइल में अंतिम टैग तक सब कुछ निकाल रहा है । मैं कई बार इसे निकालने के लिए अपना कोड कैसे बदल सकता हूं?

मेरा दूसरा सवाल होगा: -downloadonly प्लगइन काम करता है और साथ ही yum के लिए समूहों के साथ काम करता है?


3
ओह प्रिय, फिर से एक्सएक्सएक्स के साथ एक्सएमएल पार्सिंग। कि मुसीबत के लिए पूछ रहा है ...
gniourf_gniourf


8
वह एक्सएमएल को पार्स करने के लिए नहीं कह रहा है , लेकिन बाइट्स का एक विशिष्ट मैच निकालने के लिए। मूलभूत अंतर है।
रनियम

जवाबों:


32

लगता है कि तुम क्या जरूरत है की तर्ज पर अधिक कुछ है

sed -n 's:.*<id>\(.*\)</id>.*:\1:p'

(आपके नमूने में ऐसा लगता है कि <id>और </id>एक ही पंक्ति में हैं और केवल एक ही है<id>...</id> प्रति पंक्ति )।

या XML- जागरूक उपकरण का उपयोग करें:

xmlstarlet sel -t -v '//id' -n

यह बहुत साफ है, चीयर्स!
fduff

2
$ echo '<id>I am a sample group</id>' | sed 's/<\/\?[^>]\+>//g'
I am a sample group
$

यह किसी भी टैग के साथ काम करेगा , निश्चित रूप से <a href="...">...</a>एंकर के साथ भी । कोई भी GNUism का उपयोग नहीं किया गया - मूल regex समर्थन sedपर्याप्त होगा।
हालाँकि : कृपया ध्यान दें कि खुलने और बंद होने दोनों टैग एक ही पंक्ति में होने चाहिए , अन्यथा कथन को फिर से लिखना होगा।



1

यह XML है, आपको XML पार्सर का उपयोग करना चाहिए। यहाँ XMLStarlet का उपयोग कर एक समाधान है :

$ xml sel -t -v '//group/id' -nl data.xml
 group name
 group name 2

XPath अभिव्यक्ति एक नोड के नीचे //group/idकिसी भी idनोड का चयन करेगी group। इसका -t -vमतलब है "मूल्यों को निकालने के लिए निम्न टेम्पलेट का उपयोग करें"। -nlअंत में यह सुनिश्चित करें कि उत्पादन एक नई पंक्ति के साथ समाप्त हो गया है कर देगा।

ऊपर दिया गया उदाहरण एक XML फ़ाइल का उपयोग करता है जो आपके समान है, लेकिन किसी भी रेखा से युक्त ...है।


0

मैं इस पोस्ट को पढ़ रहा हूं कि Reqd निकालने के मुद्दे को हल करने के लिए। आरएचईएल 7.3 डीवीडी से पैकेज repos.xml, जो मुझे लगता है कि वास्तव में ऊपर लेखक क्या करने की कोशिश कर रहा था। इसलिए मुझे उम्मीद है कि यह स्क्रिप्ट किसी और की मदद कर सकती है ... मैंने इसे अब कई बार इस्तेमाल किया है।

इसलिए मुझे अपने "Minimal Install" RHEL7 सर्वर में "GNOME DESKTOP" समूह को स्थापित करने की आवश्यकता थी, जिसमें कोई X / GUI कॉन्फ़िगर नहीं था।

[root@rac01]# yum group list
Loaded plugins: ulninfo
There is no installed groups file.

हम्म्म्म ... यम के लिए डीवीडी पर कोई समूह सूची नहीं है (हाँ, मैंने सभी सामान्य "Google" को ठीक करने की कोशिश की और कभी भी काम नहीं किया) इसलिए xml से सूची में कठिन स्रोत का सहारा लिया।

  1. डीवीडी माउंट करें।
  2. मेरी आवश्यक पैकेज सूची के साथ XML फ़ाइल खोजें।
  3. पैकेजों के समूह की सूची निकालें।
  4. संकुल सूची के माध्यम से लूप करें और स्थापित करें (निर्भरता)।
  5. मान लिया आपने चलाया है createrepo /your/local_rpms/dir

    sudo su -
    mkdir /mnt/sr0
    mount /dev/sr0 /mnt/sr0
    cd /mnt/sr0
    
    FILE=$(find . -name "*.xml" | xargs grep '<id>gnome-desktop<\/id>'| cut -d: -f1)
    PKGLIST=$(sed -n '/<id>gnome-desktop<\/id>/,/<\/packagelist>/p' $FILE \
    | sed  -n  '/^ *<packagelist> *$/,/^ *<\/packagelist> *$/{/<packagereq type>/{d};p}' \
    | cut -d'>' -f2 \
    | cut -d'<' -f1)
    
    for p in ${PKGLIST}
       do
        yum deplist ${p}* | awk '/provider:/ {print $2}' | sort -u | xargs yum -y install
    done
    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.