
Ich möchte einen String in einer sehr einfachen XML-Konfigurationsdatei programmgesteuert aktualisieren, etwa so:
<?xml version="1.0"?>
<x>
<z>should be changed</z>
</x>
<y>
<z>should NOT be changed</z>
</y>
Gibt es einen einfachen CLI-Befehl, der x/z aktualisiert, aber NICHT y/z? Vielleicht mit einem XPath-Selektorargument wie:
$ xml-update myfile.xml /x/z "my new string"
Ich könnte etwas in Perl oder Python schreiben, aber angesichts der Einfachheit dieses Problems vermute ich, dass es bereits ein cleveres Unix-Dienstprogramm geben muss, das dies kann.
Aktualisieren: Ich habe das hier gefunden, aber es scheint mir etwas übertrieben. Und ich müsste zuerst XSLT lernen.http://developerblog.redhat.com/2013/12/05/xml-editing-bash-script/
Antwort1
Du kannst den ... benutzenxml2/2xmlTools zur einfachen Verarbeitung von XML auf der Befehlszeile. xml2
Konvertiert ein XML-Dokument in ein zeilenorientiertes Format, das für die Verwendung mit herkömmlichen Textverarbeitungstools wie awk
oder geeignet ist sed
, und 2xml
konvertiert dieses Format zurück in XML.
Als Beispiel nehme ich dieses Dokument:
<?xml version="1.0"?>
<doc>
<x>
<z>should be changed</z>
</x>
<y>
<z>should NOT be changed</z>
</y>
</doc>
Das Ausführen xml2
dieses Inhalts führt zu:
$ xml2 < doc.xml
/doc/x/z=should be changed
/doc/y/z=should NOT be changed
Ich kann den Inhalt des <z>
Elements wie folgt ändern
xml2 < doc.xml |
sed '/\/doc\/x\/z/ s/should be changed/look ma no hands/' |
2xml | tidyp -xml -i -q
Ich verwende einen sed
Suchausdruck, um explizit nach der Zeile zu suchen, die mit beginnt /doc/y/z
, und ändere dann den Inhalt dieser Zeile, was uns Folgendes gibt:
<doc>
<x>
<z>look ma no hands</z>
</x>
<y>
<z>should NOT be changed</z>
</y>
</doc>
Ich habe die Ausgabe durch tidyp
einen XML-Formatierer geleitet, da das Dokument sonst folgendermaßen aussehen würde:
<doc><x><z>look ma no hands</z></x><y><z>should NOT be changed</z></y></doc>
...was syntaktisch korrekt, aber schwerer zu lesen ist.