2017-01-10 1 views
0

Ich muss den Wert des folgenden XML-Tags durch Shell-Skript aktualisieren.Aktualisiere den Wert des XML-Tags durch das Skript

<sample>4</sample> 

Ich habe unten versucht, aber es funktioniert nicht ..

sed -i '' 's/\(<[^"]*"sample">\)\([^<]*\)\(<[^>]*\)/\1"$sampleVal"\3/g' $CONFIG_FILE 

Jede Idee, was fehlt?

-Update mit vollständigem XML-Knoten:

<?xml version="1.0" encoding="ISO-8859-1"?> 
    <Server> 
    <userInput> 
      <sample>0</sample> 
      <A> 
      <a1>9999</a1> 
      <a2>11111</a2> 
      </A> 
      <B> 
      <b1>10389</b1> 
      <b2>8000</b2> 
      </B> 

     <C>10500</C> 
     </userInput> 
     </Server> 

Aktualisierung mit Namespace:

<?xml version="1.0" encoding="ISO-8859-1"?> 
    <Server xmlns="http://a/b/c/sample.com"> 
    <userInput> 
      <sample>0</sample> 
      <A> 
      <a1>9999</a1> 
      <a2>11111</a2> 
      </A> 
      <B> 
      <b1>10389</b1> 
      <b2>8000</b2> 
      </B> 

     <C>10500</C> 
     </userInput> 
     </Server> 
+2

Bearbeiten Sie 'XML' nicht mit Textverarbeitungstools. Eine geringfügige Änderung in der XML-Formatierung wird die gesamte verwendete Textverarbeitungslogik durcheinander bringen. Verwenden Sie ein geeignetes 'XML'-Parsingtool wie [' xmlstarlet'] (http://xmlstar.sourceforge.net/) – Inian

+0

Mit allen Elementen von – user2894296

Antwort

2

Mit xmlstarlet:

xmlstarlet ed -u '/Server/userInput/sample/text()' -v "100" file.xml 

Ausgang:

<?xml version="1.0"?> 
<Server> 
    <userInput> 
    <sample>100</sample> 
    <A> 
     <a1>9999</a1> 
     <a2>11111</a2> 
    </A> 
    <B> 
     <b1>10389</b1> 
     <b2>8000</b2> 
    </B> 
    <C>10500</C> 
    </userInput> 
</Server> 

Wenn Sie Ihre Datei "in place" bearbeiten hinzufügen Option -L:

xmlstarlet ed -L -u '/Server/userInput/sample/text()' -v "100" file.xml 

Wenn Sie XML-Deklaration weglassen (<?xml ...?>) hinzufügen Option -O:

xmlstarlet ed -O -u '/Server/userInput/sample/text()' -v "100" file.xml 

Ausgang :

<Server> 
    <userInput> 
    <sample>100</sample> 
    <A> 
     <a1>9999</a1> 
     <a2>11111</a2> 
    </A> 
    <B> 
     <b1>10389</b1> 
     <b2>8000</b2> 
    </B> 
    <C>10500</C> 
    </userInput> 
</Server> 
+0

'++' für die Verwendung des richtigen Tools für den Job aktualisiert – Inian

+0

Dank Cyrus . Wenn ich einen Namespace zu hinzugefügt habe () Sollte dies im xmlstarlet-Befehl enthalten sein? – user2894296

+1

Ja: 'xmlstarlet ed -N x =" http: //a/b/c/beispiel.com "-u '/ x: Server/x: benutzereingabe/x: beispiel/text()' -v" 100 " Datei.xml' – Cyrus

Verwandte Themen