2 etiket arasında metin ayıklamak için sed kullanma


16

Bir .xml dosyası var ve ben bu .xml dosyasında birkaç yüz kitaplık olduğu gibi bir RHEL6 makinede "groupinstall" yapmaya çalışıyorum ... (16 000 satır yakın).

Bu nedenle bu yapıya sahip .xml dosyasında bulunan grup adlarını ayıklamak çalışıyorum:

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

Temel olarak, ben denedim budur:

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

.Xml dosyasını test1.txt dosyasına kopyaladım. Test1.txt grup adlarını test2.txt adlı ikinci bir dosyaya ayıklamak çalışıyorum. Ancak, yukarıdaki satırla, FIRST <id>etiketinden dosyamdaki son </id>etikete kadar her şeyi çıkarıyor . Kodumu birkaç kez ayıklamak için nasıl değiştirebilirim?

İkinci sorum şu olurdu: -downloadonly eklentisi yum gruplarıyla da çalışıyor mu?


3
Ah canım, XML'i regexps ile tekrar ayrıştırma. Bu sorun istiyor ...
gniourf_gniourf

1
Göz at bu
alecail

8
XML'i ayrıştırmak istemiyor , ancak belirli bir bayt eşleşmesini ayıklamak istiyor . Temel bir fark var.
Runium

Yanıtlar:


32

İhtiyacınız olan şey, daha fazla şey gibi görünüyor

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

(Bu senin örnekteki gibi varsayarak <id>ve </id>aynı hat üzerinde ve sadece bir tane var o <id>...</id>satıra).

Veya XML uyumlu bir araç kullanın:

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

Bu çok düzenli, şerefe!
fduff

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

Bu, herhangi bir etiketle, elbette <a href="...">...</a>çapalarla da çalışacaktır . Kullanılan GNUizm yok - temel regex desteği sedyeterli olacaktır.
Ancak, lütfen hem açılış hem de kapanış etiketlerinin aynı satırda olması gerektiğini, aksi halde ifadenin yeniden yazılması gerektiğini unutmayın.



1

Bu XML, bir XML ayrıştırıcı kullanmalısınız. XMLStarlet kullanan bir çözüm :

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

XPath ifadesi //group/idbir iddüğümün altındaki herhangi bir düğümü seçecektir group. -t -vVasıta "değerlerini ayıklamak için aşağıdaki şablonu kullanmak". -nlSonunda çıktı bir satır ile sona erdi emin yapacaktır.

Yukarıdaki örnekte, sizinkiyle özdeş, ancak içeren herhangi bir satır ...kaldırılmış bir XML dosyası kullanılmaktadır .


0

Talep çıkarma sorunu çözmek isteyen bu yazı okudum. repos.xmlYukarıdaki yazarın yapmaya çalıştığı şey olduğunu düşündüğüm RHEL 7.3 DVD'sinden gelen paketler . Umarım bu senaryo başka birine yardım edebilir… Şimdi birçok kez kullandım.

Bu yüzden "GNOME DESKTOP" grubunu, X / GUI yapılandırması yapılmamış "Minimal Install" RHEL7 sunucuma kurmam gerekiyordu.

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

Hmmmmm… yum için DVD'de grup listesi yok (evet, her zamanki "google" düzeltme-denedim ve hiç çalışmadım) çok zor kaynak xml'den listeye başvurdu.

  1. DVD'yi takın.
  2. Gerekli paket listem ile XML dosyasını bulun.
  3. Paket grubu listesini çıkarın.
  4. Paketler listesinde dolaşın ve yükleyin (bağımlılıklar dahil).
  5. Koştuğunu varsayarsak 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
    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.