Menggunakan sed untuk mengekstrak teks antara 2 tag

16

Saya memiliki file .xml dan saya mencoba melakukan "groupinstall" pada mesin RHEL6 karena ada beberapa ratus pustaka dalam file .xml itu ... (hampir 16.000 baris).

Karenanya saya mencoba mengekstrak nama grup yang terdapat dalam file .xml yang memiliki struktur ini:

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

Pada dasarnya, ini yang saya coba:

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

Saya menyalin file .xml ke test1.txt. Saya mencoba mengekstrak nama grup dari test1.txt ke file kedua bernama test2.txt. Namun, dengan baris di atas, itu mengekstraksi segala sesuatu dari <id>tag PERTAMA ke </id>tag terakhir di file saya. Bagaimana saya bisa mengubah kode saya untuk mengekstraknya beberapa kali?

Pertanyaan kedua saya adalah: apakah plugin -downloadonly berfungsi baik dengan grup untuk yum?

Guillaume F.
sumber
3
Oh sayang, parsing XML dengan regexps lagi. Itu meminta masalah ...
gniourf_gniourf
1
Lihatlah ini
alecail
8
Dia tidak meminta untuk mem - parsing XML, tetapi untuk mengekstrak kecocokan byte tertentu. Ada perbedaan mendasar.
Runium

Jawaban:

31

Kedengarannya seperti apa yang Anda butuhkan lebih dari itu

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

(dengan asumsi seperti pada sampel Anda bahwa <id>dan </id>berada pada baris yang sama dan bahwa hanya ada satu <id>...</id>per baris).

Atau gunakan alat sadar XML:

xmlstarlet sel -t -v '//id' -n
Stéphane Chazelas
sumber
Sangat rapi, tepuk tangan!
fduff
2

Tolong, cobalah

xml_grep 'id' file.xml --text_only
Kiran Kumar Reddy M
sumber
1
$ echo '<id>I am a sample group</id>' | sed 's/<\/\?[^>]\+>//g'
I am a sample group
$

Ini akan bekerja dengan tag apa pun , tentu saja juga dengan <a href="...">...</a>jangkar. Tidak ada GNUisme yang digunakan - dukungan regex dasar di sedsudah cukup.
Namun : harap perhatikan bahwa tag pembuka dan penutup harus di baris yang sama, jika tidak, pernyataan harus ditulis ulang lagi.

kesalahan sintaks
sumber
1

Ini adalah XML, Anda harus menggunakan parser XML. Berikut ini solusi menggunakan XMLStarlet :

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

Ekspresi XPath //group/idakan memilih sembarang idsimpul di bawah satu groupsimpul. The -t -vberarti "menggunakan template berikut untuk mengekstrak nilai-nilai". Itu-nl akhir akan memastikan bahwa output diakhiri dengan baris baru.

Contoh di atas menggunakan file XML yang identik dengan Anda, tetapi dengan setiap baris yang mengandung ...dihapus.

Kusalananda
sumber
0

Saya membaca posting ini mencari untuk menyelesaikan masalah mengekstraksi Reqd. Paket dari DVD RHEL 7.3 repos.xml, yang saya pikir persis apa yang penulis coba coba lakukan. Jadi saya harap skrip ini dapat membantu orang lain ... Saya telah menggunakannya berkali-kali sekarang.

Jadi saya perlu menginstal grup "GNOME DESKTOP" ke server RHEL7 "Minimal Install" saya yang tidak memiliki konfigurasi X / GUI.

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

Hmmmmm… tidak ada daftar grup pada DVD untuk yum (ya, saya sudah mencoba semua perbaikan "google" yang biasa dan tidak pernah berhasil) jadi terpaksa mencari sumber dari daftar xml.

  1. Pasang DVD.
  2. Temukan file XML dengan daftar paket wajib saya.
  3. Ekstrak daftar kelompok paket.
  4. Ulangi daftar paket dan instal (termasuk dependensi).
  5. Anggap saja Anda sudah lari 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
    
kapten
sumber