CLI-Befehl zum Aktualisieren einer einfachen XML-Datei

CLI-Befehl zum Aktualisieren einer einfachen XML-Datei

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. xml2Konvertiert ein XML-Dokument in ein zeilenorientiertes Format, das für die Verwendung mit herkömmlichen Textverarbeitungstools wie awkoder geeignet ist sed, und 2xmlkonvertiert 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 xml2dieses 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 sedSuchausdruck, 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 tidypeinen 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.

verwandte Informationen