XML etiketlerini okuyun ve ardından bir kabuk betiği kullanarak [etiketlerini kapat] XML etiketlerini kaldırın


1

Aşağıdaki girişi göz önüne alındığında:

<start>
   <header>
      This is header section
   </header>
   <body>
      <body_start>
         This is body section
         <a>
            <b>
               <c>
                  <st>111</st>
               </c>
               <d>
                  <st>blank</st>
               </d>
            </b>
         </a>
      </body_start>
      <body_section>
         This is body section
         <a>
            <b>
               <c>
                  <st>5</st>
               </c>
               <d>
                  <st>666</st>
               </d>
            </b>
            <b>
               <c>
                  <st>154</st>
               </c>
               <d>
                  <st>1457954</st>
               </d>
            </b>
            <b>
               <c>
                  <st>845034</st>
               </c>
               <d>
                  <st>blank</st>
               </d>
            </b>
         </a>
      </body_section>
   </body>
</start>

Aşağıdaki ayrıştırmayı yapmak istiyorum.

Eğer stdeğeri cetiketi olan 154, daha sonra tüm <b>için </b>kaldırılan için ihtiyaçlarını etiketleyin. 154 değerinin dosyada bulunabileceğini veya bulunmayabileceğini unutmayın.

Dolayısıyla, eğer 154 değeri mevcutsa, aşağıdaki parçanın çıkarılması gerekir:

<b>
   <c>
      <st>154</st>
   </c>
   <d>
      <st>1457954</st>
   </d>
</b>

Kodlamayı bir kabuk betiğinde yapmak istiyorum. Kullanamıyorum xsltçünkü sistemim desteklemiyor.


Bence sedbu görev için ideal bir araç değil. Perl, php veya benzeri bir dil kullanmalısınız - veya xml ile ilgili bir araç.
saat

4
Neredeyse tüm unix tabanlı sistemlerin depolarında varsa neden bir bisiklet icat ettin xmlstarlet?
Alex

Yanıtlar:


0

pupHTML'yi işlemek için bir komut satırı aracı kullanabilirsiniz . XML için kullanabilirsiniz xpup.

Örneğin, çıkarılacak parçaları bulmak için aşağıdakileri çalıştırın:

$ pup ':parent-of(:parent-of(:contains("154")))' <file.html
<b>
 <c>
  <st>
   154
  </st>
 </c>
 <d>
  <st>
   1457954
  </st>
 </d>
</b>

Bu bölümü giriş sayfasından sed( file.htmlHTML dosyanız nerede) kullanarak kaldırmak için, şunu çalıştırın:

 sed "s@$(pup ':parent-of(:parent-of(:contains("154")))' <file.html | xargs | tr -d " ")@@g" <(xargs <file.html | tr -d " ")

Notlar:

  • xargs <file.html | tr -d " "Dosyayı boşluksuz tek bir satıra düzleştirmek için kullanıyoruz .
  • pupKaldırılacak deseni bulmak için belirtilen komutu kullanırız.
  • Biz kullanmak sedkalıbı çıkarmak için: sed "s@PATTERN@@g" <(input).
  • Yerinde (dosyayı değiştirerek) değiştirmek için eklemek -iGNU en için sedya -i'.bak'BSD'lerin için sed.

Daha kolay anlaşılması için aşağıdaki komut dosyası kullanılabilir:

function flat_it() { xargs | tr -d " "; }
input=$(flat_it <file.html)
remove=$(pup ':parent-of(:parent-of(:contains("154")))' <<<$input | flat_it)
sed "s@$remove@@g" <<<$input

Not: Yukarıdaki yöntemin dezavantajı, içerik dahil olmak üzere tüm boşlukların kaldırılmasıdır. Daha iyi hale getirmek için başka bir düzleştirme giriş yolu kullanılmalıdır.

Yani yerine xargs | tr -d " ", sed, exveya pastekullanılabilir.

İşte kullanarak örnek ex:

ex +%j +"s/[><]\zs //g" +%p -scq! file.html

Ve işte kabuk işlevli (önceki sürümü değiştirebilen) sürüm:

function flat_it() { ex +%j +"s/[><]\zs //g" +%p -scq! /dev/stdin; }
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.