2017-03-20 3 views
1

Die betreffenden XML-Datei:xmlstarlet sel-Befehl in einem Bash-Skript - Löschen eines Tags

<properties> 
    <structure name="preference"> 
     <structure name="cam1"> 
      <property name="number" value="8"/> 
      <property name="name" value="eddi"/> 
     </structure> 
     <structure name="cam2"> 
      <property name="number" value="2"/> 
      <property name="name" value="franck"/> 
     </structure> 
    </structure> 
</properties> 

In meinem Bash-Skript, ich möchte den Wert „8“ in einer Variablen einfügen es dann in einem Zustand verwendet werden (ob). Wenn der Wert gleich "8" ist, muss ich die Struktur "cam1" löschen.

Also, ich versuche, mit diesem Befehl zu verwenden xmlstarlet Werkzeug:

xmlstarlet sel -T -t -m '/properties/structure[@name="preference"]/structure[@name="cam1"]/property[@name="number"]/@value' -v . -n file.xml 

Dies war der Befehl in einem Terminal zu verwenden, um den Wert, in dem Skript zu bekommen, schrieb ich es auf diese Weise:

camera=`xmlstarlet sel -T -t -m \'/properties/structure[@name=\"preference\"]/structure[@name=\"cam1\"]/property[@name=\"number\"]/@value\' -v . -n $1` 

dann versuchen, die Variable zu drucken:

echo $camera 

natürlich ich mein Ergebnis nicht haben "8" gedruckt, I denke ich habe ein Problem mit dem Backflash ... gibt es eine andere Möglichkeit, einfach die Struktur zu löschen?

Antwort

0

Ich bin nicht 100% sicher, wie Sie bestimmen, wo die „8“ herkommt. Warum den zu verwendenden Wert als Vergleich im Löschvorgang extrahieren?

Hier ist ein Beispiel, das das structure Element löschen, wenn das Kind property Element, mit dem name Attributwert von number, ein value Attribut mit dem Wert von 8 hat.

Hoffe, das hilft.

#!/usr/bin/env bash 

toDelete="8" 
modXML=$(xmlstarlet ed -d "/properties/structure[@name='preference']/structure[property[@name='number']/@value=$toDelete]" $1) 

echo $modXML