ใช้ sed เพื่อแยกข้อความระหว่าง 2 แท็ก


16

ฉันมีไฟล์. xml และฉันพยายามทำ "groupinstall" บนเครื่อง RHEL6 เนื่องจากมีหลายร้อยไลบรารีในไฟล์. 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 อย่างไรก็ตามด้วยบรรทัดด้านบนจะแยกทุกอย่างจาก<id>แท็กFIRST ไปยัง</id>แท็กสุดท้ายในไฟล์ของฉัน ฉันจะเปลี่ยนรหัสของฉันเพื่อดึงหลาย ๆ ครั้งได้อย่างไร

คำถามที่สองของฉันคือ: ปลั๊กอิน -downloadonly ใช้งานได้ดีกับกลุ่มสำหรับ yum หรือไม่


3
โอ้กำลังแยกวิเคราะห์ XML ด้วย regexps อีกครั้ง นั่นคือการถามถึงปัญหา ...
gniourf_gniourf

1
มีลักษณะที่นี้
alecail

8
เขาไม่ได้ขอให้แยกวิเคราะห์ XML แต่เพื่อแยกการจับคู่ที่เฉพาะเจาะจงของไบต์ มีความแตกต่างพื้นฐาน
Runium

คำตอบ:


31

เสียงเหมือนสิ่งที่คุณต้องการคือบางสิ่งบางอย่างมากขึ้นตามสายของ

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

(สมมติว่าเหมือนในตัวอย่างของคุณว่า<id>และ</id>อยู่ในบรรทัดเดียวกันและมีเพียงหนึ่งรายการ<id>...</id>ต่อบรรทัด)

หรือใช้เครื่องมือตระหนักถึง XML:

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

นั่นเป็นเรื่องที่ดีมากไชโย!
fduff


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

วิธีนี้จะใช้ได้กับแท็กใด ๆและแน่นอนว่าใช้กับ<a href="...">...</a>จุดยึด ไม่มี GNUisms ที่ใช้ - การสนับสนุน 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 แพ็คเกจจากดีวีดี RHEL 7.3 repos.xmlซึ่งฉันคิดว่าเป็นสิ่งที่ผู้เขียนพยายามทำ ดังนั้นฉันหวังว่าสคริปต์นี้อาจช่วยคนอื่น ... ฉันเคยใช้มาหลายครั้งแล้ว

ดังนั้นฉันต้องติดตั้งกลุ่ม "GNOME DESKTOP" ไปยังเซิร์ฟเวอร์ "ติดตั้งขั้นต่ำ" RHEL7 ของฉันที่ไม่มี X / GUI ที่กำหนดค่าไว้

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

อืม ... ไม่มีรายชื่อกลุ่มใน DVD สำหรับ yum (ใช่ฉันลองแก้ไข "google" ตามปกติและไม่ทำงาน) ดังนั้นจึงใช้แหล่งข้อมูลจาก xml

  1. ติดตั้ง DVD
  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
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.