Heinrich_Schwietering
Wikiteam
Anmeldungsdatum: 12. November 2005
Beiträge: 11324
Wohnort: Bremen
|
Hi! Um die Vagamule-Konfigurationsdatei einfach in einen funktionsfähigen Zustand zu versetzen, muss eine Zeile eingefügt werden, die leider mit dem Patch nicht mehr erstellt wird. In ~/.vagalume/config.xml fehlt nach der Zeile <overwrite>0</overwrite> der Eintrag
<ownb>1</ownb> Wie könnte ich den mit einem Kommandozeilen-Befehl dort hinbekommen? so long hank
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Das solltest Du mit xmlstarlet hinbekommen ☺
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17588
Wohnort: Berlin
|
| sed "/<overwrite>0<\/overwrite>/a<ownb>1</ownb>" ~/.vagalume/config.xml
|
/.../ umfasst das zu findende Pattern, hier einfach der Text, wobei das / maskiert werden muss, um nicht für den Abschluss gehalten zu werden. a ist append danach das, was anzuhängen ist.
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Man kann natürlich mit sed und Konsorten vorgehen - allerdings bist Du mit einem spezialisierten Werkzeug auf der sicheren Seite. Hier wäre der Befehlsaufruf mit xmlstarlet :
| xmlstarlet ed -a "//overwrite" -t elem -n "ownb" -v 1 file.xml
|
Ggf. musst Du den XPath-Ausdruck noch anpassen.
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11324
Wohnort: Bremen
|
Hi! @ user unknown So hatte ich mir das ja auch vorgestellt; leider passiert damit aber gar nichts... (Wie) Müssten denn die Leerzeichen vor <overwrite>0<\/overwrite> behandelt werden? @ Lysander
Da http://xmlstar.sourceforge.net/doc/UG/ch04s03.html steht es vielleicht - allein, ich find es nicht 😉 so long hank EDIT Lysanders Befehl hat mir im Terminal auch brav das gewünschte Resultat ausgegeben; nur hab' ich dann (Beim versuch es wieder beim nächsten Aufruf umzulenken? oder schon beim ersten Aufruf?) die Datei "geleert", es steht also nix mehr drin...
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Heinrich Schwietering schrieb: In ~/.vagalume/config.xml fehlt nach der Zeile
Nein, nicht nach der Zeile, sondern nach dem Tag ! Es geht da um XML, und da sind Zeilen Schall und Rauch ... Das was Lysander vorschlägt, ist in der Tat der bequemste Weg, sowas fachgerecht zu erledigen. Wenn Du selber etwas anpassen willst, gibt es eine schöne Übersicht, wie man den Suchterm formulieren kann: http://zvon.org/xxl/XPathTutorial/Output_ger/example1.html und folgende. (die Xpath-Ausdrücke gelten für alle XML-Tools, also auch für xmlstarlet !) Edit: (Wie) Müssten denn die Leerzeichen vor <overwrite>0<\/overwrite> behandelt werden?
Gar nicht, das ist doch gerade der Vorteil ! - (es geht ja nur nach den Tags) Wieso funktioniert das Ding von Lysander nicht ?? - :
track@lucid:~$ echo '<xml> <overwrite>0</overwrite> </xml>' | xmlstarlet ed -a "//overwrite" -t elem -n "ownb" -v 1
<?xml version="1.0"?>
<xml>
<overwrite>0</overwrite>
<ownb>1</ownb>
</xml> Kannst Du im Zweifel mal bitte eine Original-Musterdatei posten ? track
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11324
Wohnort: Bremen
|
Hi! Es funktioniert ja... xmlstarlet ed -a "//overwrite" -t elem -n "ownb" -v 1 config.xml gibt mir im Terminal genau das aus, was ich haben wollte; die Ausgabe wollte ich mit angehängtem > /home/heinrich/.vagalume/config.xml wieder in die Datei leiten; das klappte aber nicht, danach war die Datei leer, im Terminal nur ein Fehlermeldung.
config.xml:1: parser error : Document is empty
^
config.xml:1: parser error : Start tag expected, '<' not found
^ In eine andere Datei ging es allerdings schon. Gibts da auch so etwas wie eine -i-Option wie bei sed, damit das Ergebnis gleich wieder in die Ursprungsdatei eingefügt wird? so long hank
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Heinrich Schwietering schrieb: In eine andere Datei ging es allerdings schon. Gibts da auch so etwas wie eine -i-Option wie bei sed, damit das Ergebnis gleich wieder in die Ursprungsdatei eingefügt wird?
Musst Du eben mal in der Doku suchen 😉 Ich finds übrigens cool, dass das Kommando von mir - ohne es getestet zu haben - direkt funktioniert hat 😀
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11324
Wohnort: Bremen
|
Hi! OK, -L , oder --inplace passen 😉 Thanks! so long hank
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17588
Wohnort: Berlin
|
Heinrich Schwietering schrieb: Hi! @ user unknown So hatte ich mir das ja auch vorgestellt; leider passiert damit aber gar nichts... (Wie) Müssten denn die Leerzeichen vor <overwrite>0<\/overwrite> behandelt werden?
Das Kommando alleine würde nur die veränderte Datei ausgeben. Um die Datei 'in place' zu ändern benötigt man den -i -Schalter: | sed -i "/<overwrite>0<\/overwrite>/a<ownb>1</ownb>" ~/.vagalume/config.xml
|
Sed sucht nach dem Ausdruck in einer Zeile, ohne dass der Ausdruck die ganze Zeile treffen müßte - das würde man - wenn man wollte - mit ^ und $ für Zeilenanfang/-ende ausdrücken:
| sed -i "/^<overwrite>0<\/overwrite>$/a<ownb>1</ownb>" ~/.vagalume/config.xml
|
aber das willst Du ja gerade nicht. xmlstarlet spielt seine Vorteile insbesondere dann aus, wenn der Ausdruck nicht in einer Zeile auftaucht, oder andere, optionale Elemente enthielt:
| /<overwrite>0
<\/overwrite>
/<overwrite>0<\/overwrite>
/<overwrite> 0<\/overwrite>
/<overwrite>0 <\/overwrite>
/<overwrite> 0 <\/overwrite>
/<overwrite chakatu="flop, flip, zimkatu">0<\/overwrite>
|
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11324
Wohnort: Bremen
|
Hi! @ user unknown Ja, das mit dem -i-Schalter hatte ich schon so gemacht; trotzdem passierte gar nichts, muss wohl noch irgendwas anderes falsch gelaufen sein 😐 . Mit
sed -i "/<overwrite>0<\/overwrite>/a\ \ <ownb>1</ownb>" ~/.vagalume/config.xml geht es jetzt auch, auch die beiden Leerzeichen am Anfang werden wieder eingefügt, so das es wieder perfekt aussieht. Das ist die einfachere Version, um es im Wiki aufzunehmen, weil xmlstarlet ja erst installiert werden müsste. thx! 👍 so long hank
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Heinrich Schwietering schrieb: Das ist die einfachere Version, um es im Wiki aufzunehmen, weil xmlstarlet ja erst installiert werden müsste.
Es ist aber vor allem eine gefährliche - rekursives Markup parsen kann man nicht zuverlässig mit sed . Punkt. Aber das hatten wir hier schon zig mal...
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17588
Wohnort: Berlin
|
Lysander schrieb:
Es ist aber vor allem eine gefährliche - rekursives Markup parsen kann man nicht zuverlässig mit sed . Punkt. Aber das hatten wir hier schon zig mal...
Wenn die XML-Datei von einem Programm erzeugt wird, dann doch wohl immer wieder auf die gleiche Weise. Erst wenn unterschiedliche Programme das XML verarbeiten, und andere die Freiheiten von XML für ein anderes Format, also sowas wie oben beschriebenes, verwenden, mit zusätzlichen Blanks z.B., wird der sed-Ansatz scheitern. Danach sieht es hier aber nicht aus. Eine neue Programmversion könnte das Format ändern, aber kann das Format in jede andere Richtung auch ändern, auch in Richtungen, bei denen xmlstarlet auch scheitert.
Punkt.
Punkt, basta, helau! 😉
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11324
Wohnort: Bremen
|
Hi! Die config.xml-Datei wird automatisch neu angelegt, wenn man sie löscht... Vermutlich ist das Risiko von "unzuverlässigem rekursiven Markup Parsen" (was immer es genau bedeuten mag 😉) - hoffentlich - nicht allzu groß... Ich habe aber im Vagamule-Artikel nochmal hierher verlinkt, als mögliche Alternativ-Lösung kann man dann auch die xmlstarlet-Methode wählen. so long hank
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
user unknown schrieb: Wenn die XML-Datei von einem Programm erzeugt wird, dann doch wohl immer wieder auf die gleiche Weise.
Das ist sicherlich nicht garantiert.
Erst wenn unterschiedliche Programme das XML verarbeiten, und andere die Freiheiten von XML für ein anderes Format, also sowas wie oben beschriebenes, verwenden, mit zusätzlichen Blanks z.B., wird der sed-Ansatz scheitern.
In solch einem Szenario ist das Risiko sicherlich noch größer, ja.
aber kann das Format in jede andere Richtung auch ändern, auch in Richtungen, bei denen xmlstarlet auch scheitert.
Wenn sich das Schema ändert muss man den Ausdruck ggf. anpassen, das stimmt wohl.
Punkt, basta, helau! 😉
Alaaf? 😉 @Heinrich Schwietering Ich würde stets das idiomatisch richtige Werkzeug benutzen. Es mag mehr Aufwand beim Installieren machen, dafür hat man einfach weniger Ärger.
|