Ich habe ein sehr große (100+ Megabyte unkomprimierte) XML-Datei, die Datensätze speichert, und ich versuche, einige Werte selektiv zu ändern.
Zum Beispiel sagen sample.xml
sieht aus wie das:
<objects>
<object>
<name>Foo</name>
<constant1>10</constant1>
<constant2>20</constant2>
</object>
<object>
<name>Bar</name>
<constant1>15</constant1>
<constant2>40</constant2>
</object>
<objects>
Jetzt möchte ich den Wert von ändern <constant1>
bis 18, aber nur für das Objekt, dessen Name
Element hat einen Wert Foo
. Ich habe an der XML Starlet-Dokumentation gestochert, aber es ist Artikel zum Bearbeiten Es gibt nur Beispiele dafür, wie man Attribute von Elementen direkt im Baum sucht, es sei denn, ich vermisse etwas ...
Antworten:
12 für die Antwort № 1... Anscheinend bin ich ein Idiot; Wie in diese Antwort Sie können nach Elementwerten auf die gleiche Weise suchen, wie Sie nach Attributwerten suchen können. Der richtige Befehl wäre also:
xmlstarlet ed -u "//object[name="Foo"]/const1" -v 18 sample.xml
... Vorbehalt bei der Arbeit an wirklich großen Dateien: Ohne Ausgabeumleitung, xmlstarlet
druckt auf stdout. Alle 100+ Megabyte an XML. Hoppla.