Text an Datei (xml) anfügen mit awk, sed, perl oder Ähnlichem...

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Schlaubi_fi.de, 01.03.2006.

  1. #1 Schlaubi_fi.de, 01.03.2006
    Schlaubi_fi.de

    Schlaubi_fi.de Mac OS X User

    Dabei seit:
    22.12.2004
    Beiträge:
    304
    Zustimmungen:
    0
    Hallo,

    nun habe ich auch mal ein Problem :D
    Und zwar habe ich z.B. solch eine Datei:

    Code:
    <?xml version="1.0" ?>
    <message xmlns:test="http://www.xxx.de/test"
             xmlns:new-val="http://www.xxx.de/new-value"
             xmlns:new-fct="http://www.xxx.de/new-fct">
    
      <commands currentstep="0">
        <command target="XMLQuery" method="qbe" key="xmlquery"/>
        <command target="client"/>
        <command target="XMLQuery" method="upd-check" key="xmlquery"/>
      </commands>
    
      <xmlquery encoding="UTF-8" optimize-type="joinmerge"
                 schema="test" db-service="jdbc/test"
                 in-slot=""  in-key="parties"
                 out-slot="" out-key="parties">
        <pathstep name="party">
        </pathstep>
      </xmlquery>
    
      <parties>
        <party id="@PARTYID@"/>
      </parties>
    
    </message>
    
    Bei dem Element 'message' soll das Attribut revision="$Revision$" dazu,
    also:

    Code:
    <?xml version="1.0" ?>
    <message xmlns:test="http://www.xxx.de/test"
             xmlns:new-val="http://www.xxx.de/new-value"
             xmlns:new-fct="http://www.xxx.de/new-fct" [b]revision="$Revision$"[/b]>
    
      <commands currentstep="0">
        <command target="XMLQuery" method="qbe" key="xmlquery"/>
        <command target="client"/>
        <command target="XMLQuery" method="upd-check" key="xmlquery"/>
      </commands>
    
      <xmlquery encoding="UTF-8" optimize-type="joinmerge"
                 schema="test" db-service="jdbc/test"
                 in-slot=""  in-key="parties"
                 out-slot="" out-key="parties">
        <pathstep name="party">
        </pathstep>
      </xmlquery>
    
      <parties>
        <party id="@PARTYID@"/>
      </parties>
    
    </message>
    Jetzt habe ich das Problem, dass ich nicht nur eine sondern mehrer solcher Dateien habe in denen ich revision="$Revision$" hinzufügen möchte, nur leider lautet das erste Element nicht immer 'message' und außerdem ist es nicht immer auf 3 Zeilen aufgeteilt.

    Deshalb klappt auch mein erster Ansatz nur für genau diese Datei, aber eben nicht allgemein:
    Code:
    perl -wne '/<message/ and do { print; $_=<>; print; $_=<>; s/>/
    revision="\$Revision\$">/; print;  next; }; print;' x.xml
    Irgendwelche Ideen? :(

    //NACHTRAG:
    Die Datei kann auch z.B. wie folgt aufgebaut sein:
    Code:
    <?xml version="1.0" ?>
    <message>
      <commands currentstep="0">
        <command target="ScriptletManager" method="gc" scriptlet="admin.GC"/>
      </commands>
    </message>
    Das soll daraus werden:
    Code:
    <?xml version="1.0" ?>
    <message [b]revision="$Revision$"[/b]>
      <commands currentstep="0">
        <command target="ScriptletManager" method="gc" scriptlet="admin.GC"/>
      </commands>
    </message>
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    So etwa?

    Code:
    perl -ne '$t.=$_; END{$t=~s!(<message.*?)>!\1 revision="\$Revision\$">!sg; print $t}' x.xml
    
    Gruss, Phorus
     
  4. #3 Wolfgang, 01.03.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Wenn die Dateien nicht so groß sind (mehrere MB), dann geht auch sowas:
    Code:
    perl -0\777 -pe 's/(<message[^>]+?)>/$1 revision="\$REVISION\$">/g' Datei
    File Slurp ;)
    Gruß Wolfgang
    PS Wer ist eigentlich dieser Phorus? :devil:
     
  5. #4 Xanti, 01.03.2006
    Zuletzt bearbeitet: 01.03.2006
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Code:
    ...[^>]+?)...
    
    Damit erschlägst Du nicht den Fall <message>, aber ansonsten hast Du wieder die kürzeste Lösung gefunden...grrr ;)

    Arg, verdammte Gewohnheit ;)
     
  6. #5 tobiedl, 01.03.2006
    tobiedl

    tobiedl Tripel-As

    Dabei seit:
    12.04.2005
    Beiträge:
    231
    Zustimmungen:
    0
    Nennt ihr euch alle zur Verwirrung der User um (Karneval ist doch vorbei)? :D
     
  7. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    :D
     
  8. #7 Wolfgang, 01.03.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Aber damit:
    Code:
    perl -0\777 -pe 's/(<message[^>][color=red]*[/color]?)>/$1 revision="\$REVISION\$">/g' liste
    
    Ausreden!
    Wenn hier einer Alzheimer haben darf, dann ich.:D

    Gruß Wolfgang ( der nur seine _1 verloren hat)
     
  9. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Ich bin sogar so frech zu sagen, dass es auch ohne [^>] geht. ;)
     
  10. #9 Wolfgang, 01.03.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo @Phorus ähhm Xanti(ppe) :D
    Ich seh, dass du stark im kommen bist, mir langsam die Puste ausgeht um gegenzuhalten...
    Aber euer Ehren, hier irrt ihr.:devil:
    Das geht so nur im Falle von <message>

    Du darfst trotzdem weiter frech sein.
    :D
    Gruß Wolfgang
     
  11. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Arg, hab übersehen, dass Du nicht den /s-Schalter beim Substitute getätigt hast. ".*?../s" statt "[^>]*?" ist trotzdem kürzer :D
     
  12. #11 Wolfgang, 01.03.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Mit welcher Datei hast du das erfolgreich getestet?
    Code:
    perl -0\777 -pe 's/(<message*?)>/$1 revision="\$REVISION\$">/sg' list
    <?xml version="1.0" ?>
    <message xmlns:test="http://www.xxx.de/test"
             xmlns:new-val="http://www.xxx.de/new-value"
             xmlns:new-fct="http://www.xxx.de/new-fct">
    
            <commands currentstep="0">
            <command target="XMLQuery" method="qbe" key="xmlquery"/>
            <command target="client"/>
            <command target="XMLQuery" method="upd-check" key="xmlquery"/>
            </commands>
    
            <xmlquery encoding="UTF-8" optimize-type="joinmerge"
                    schema="test" db-service="jdbc/test"
                    in-slot=""  in-key="parties"
                    out-slot="" out-key="parties">
                            <pathstep name="party">
                            </pathstep>
            </xmlquery>
    
            <parties>
                    <party id="@PARTYID@"/>
            </parties>
    
        </message>
    
    ???
    :brav: duck und wech
    Gruß Wolfgang
    PS Warum ist mein CODE-Bereich immer so schmal?
     
  13. #12 Xanti, 01.03.2006
    Zuletzt bearbeitet: 01.03.2006
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Das geht schon, Du hast den "." vor "*?" vergessen ;)

    edit: "." geht natürlich unter, wenn man ... als umgangssprachlichen Terminus ebenfalls im Code benutzt, ... meine Schuld ;)
     
  14. #13 Wolfgang, 01.03.2006
    Zuletzt bearbeitet: 01.03.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Jo, das ist latürnich etwas anderes.
    :think:
    Damit sind wir auf den Punkt gekommen.
    Ich gebe mich geschlagen.

    Gruß Wolfgang
    PS Wie beim Sport:
    Du legst was vor, ich übertreff es und du legst noch einen daruf.
    Ergo bist du auf dem Treppchen
    Gratulation!
    8)
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 Schlaubi_fi.de, 02.03.2006
    Zuletzt bearbeitet: 02.03.2006
    Schlaubi_fi.de

    Schlaubi_fi.de Mac OS X User

    Dabei seit:
    22.12.2004
    Beiträge:
    304
    Zustimmungen:
    0
    Ja waaaaaaahnsinn!!!...da haut's mich doch glatt vom Hocker,
    vielen vielen Dank bis hier her schon einmal :))

    Der Code funktioniert:
    Code:
    perl -0\777 -pe 's/(<message.*?)>/$1 revision="\$Revision\$">/sg' list
    Jetzt habe ich nur noch 2 Problemchen...

    1. Das erste Element nach dem Root-Element (gekennzeichnet mit <?xml version="1.0" ?>) muss nicht umbedingt 'message' heißen

    2. Bei dem obigen Code wird hinter jedes in 'list' vorkommende <message> (was jedoch auch anders heißen kann) das $Revision$ geschrieben, dies sollte jedoch nur beim ersten Element (egal wie es heißt) passieren, das nach dem Root-Element kommt also nach <?xml version="1.0" ?>


    Also ich bin ja jetzt schon überglücklich und völlig aus dem Häuschen, weil das ziemlich viel Zeit erspart bei ca. 500 Dateien, also wenn das nicht machbar ist dann muss ich halt in den sauren Apfel beißen und es manuell machen, schonmal vielen Dank im Voraus!!! :))

    PS: Natürlich habe ich mir auch meine Gedanken gemacht, aber sowas z.B.:
    Code:
    perl -0\777 -pe 's/(<.*?)>/$1 revision="\$Revision\$">/sg' list
    löst auch noch keines meiner Probleme, da es hierbei hinter jedes Element setzt, soll aber nur nach dem ersten Element, dass nach dem Root-Element kommt stehen...ich hoffe es ist verständlich was gemeint ist.
     
  17. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Bitte schön :)

    Code:
    perl -0\000 -pe 's/(<\?xml version="1.0" \?>\n<.*?)>/$1 revision="\$Revision\$">/sg' xml
    
    @Wolfgang: Hab gerade gesehen, dass bei "-0\000" keine Grössenbeschränkung besteht, jedenfalls hab ichs gerade an einem 500 MB-File getestet.
     
Thema:

Text an Datei (xml) anfügen mit awk, sed, perl oder Ähnlichem...

Die Seite wird geladen...

Text an Datei (xml) anfügen mit awk, sed, perl oder Ähnlichem... - Ähnliche Themen

  1. Timestamp an Inhalt einer Textdatei anfügen

    Timestamp an Inhalt einer Textdatei anfügen: Hallo, ich als neuer, unerfahrener Nutzer von Linux und der bash hätte folgende Frage. Und zwar würde ich gerne mit einem command den Zeitstempel...
  2. Textdatei zeilenweise in durchnummerierte Variablen schreiben

    Textdatei zeilenweise in durchnummerierte Variablen schreiben: Hi Leute, ich versuche folgendes Problem zu lösen. Ich möchte eine Textdatei einlesen und den Inhalt jeder Zeile in immer eine neue Variable...
  3. SSH Login nur mit einer bestimmten IP die in einer Textdatei gespeichert wird

    SSH Login nur mit einer bestimmten IP die in einer Textdatei gespeichert wird: Hallo Ich bin andauernd Opfer einer Brute Force Attacke. Die IPs die fehlerhafte Logins produzieren werden nach dem 3ten Versuch gesperrt. Aber...
  4. Programm für Audiodatei in Textdatei konvertieren

    Programm für Audiodatei in Textdatei konvertieren: Hallo, ich habe für ein Projekt eine Menge Interviews geführt und habe diese digital auf dem Rechner. Allerdings dauert das Abtippen ewig....
  5. nach einem wort in einer textdatei suchen

    nach einem wort in einer textdatei suchen: halloooo ihr lieben, ich hoffe ihr könnt mir weiterhelfen :) ich lernen momentan die skriptsprache shell und alles was dazu gehört. ich soll...