tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
923
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Buba235 Buba235 ist offline Mitglied Brokat
    Registriert seit
    Apr 2006
    Beiträge
    278
    Hallo Leute!

    Ich bin mir nicht sicher ob ich hier im Forum mit meiner Frage richtig bin, aber ich versuche es einmal.

    Mein Problem ist, dass ich in einer XML Datei ein bestimmtes Wort ersetzen muss. Das wäre ja nicht schlimm und auch ziemlich einfach, aber ich habe keinen Anhaltspunkt, wie ich das Wort suchen soll. Das Problem in dieser Datei ist nämlich, dass die Schlüsselwörter "<key>" und "<value>" immer vorkommen. Zur Veranschaulichung:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    <dictionary>
        <key>org.eclipse.cdt.make.core.build.arguments</key>
        <value></value>
    </dictionary>
    <dictionary>
        <key>org.eclipse.cdt.make.core.buildLocation</key>
        <value>D:/work/unified/sdk_ansi_c/sdk/examples/demoserver</value>
    </dictionary>
    <dictionary>
        <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
        <value>false</value>
    </dictionary>
    <dictionary>
        <key>org.eclipse.cdt.make.core.environment</key>
        <value>VERBOSE=1|</value>
        <value></value>
    </dictionary>
    <dictionary>
        <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
        <value>false</value>
    </dictionary>

    So sieht die Datei aus ^. Ich möchte jetzt mit sed den value false (von org.eclipse.cdt.make.core.useDefaultBuildCmd) auf true ersetzen. Wie kann ich das denn machen? Hat da jemand eine Hilfe für mich?
    Ich habe es so versucht:

    Code :
    1
    
    sed -i -e "s/\(<key>org.eclipse.cdt.make.core.useDefaultBuildCmd<\/key>\n<value>false<\/value>\)\(./\<key>org.eclipse.cdt.make.core.useDefaultBuildCmd<\/key>\n<value>true<\/value>/" .project

    Bitte um euere Hilfe

    Gruß Buba
     
    -- Wer auch nur etwas Freiheit für mehr Sicherheit aufgibt, ist beides nicht wert! --

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Warum willst du das mit sed machen? Warum nimmst du nicht einen XSLT Prozessor (xsltproc o.ä.)?

    Code :
    1
    2
    3
    
    /<key>org.eclipse.cdt.make.core.useDefaultBuildCmd<\/key>/,/<\/value>/{
      s,<value>[^<]*</value>,<value>true</value>,
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Buba235 Buba235 ist offline Mitglied Brokat
    Registriert seit
    Apr 2006
    Beiträge
    278
    Hallo!

    Aus dem einfachen Grund, weil ich nur die cygwin bash habe und nur dieses false auf true setzen will. Ich generiere nämlich vorher ziemlich viele Dinge und die einzige Sicherheit ist sed, die auf jeder Maschine vorhanden ist.
     
    -- Wer auch nur etwas Freiheit für mehr Sicherheit aufgibt, ist beides nicht wert! --

  4. #4
    Avatar von Navy
    Navy Navy ist offline Freiwillige Serverwehr
    tutorials.de Administrator
    Registriert seit
    Jul 2003
    Ort
    Montreal (Quebec)
    Beiträge
    1.667
    Sed arbeitet zeilenorientiert, d.h. damit wird das nicht so ohne weiteres gehen. Guck Dir mal awk an, das ist ziemlich mächtig und in den GNU-Utils enthalten.

    Oder aber Du ersetzt in mehreren Durchläufen das Linefeed von Zeilen innerhalb entsprechender Tags durch ein eindeutiges Zeichen[Tupel], lässt sed nochmal drüberlaufen und setzt dann das Linefeed wieder ein.

    Die Lösung mit awk wäre eleganter.
     
    Navy

    --
    Echtzeithilfe unter irc.tutorials.de #tutorials.de

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    @Buba235: bitte markier doch deine Themen als erledigt wenn deine Frage beantwortet ist.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    olqs olqs ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Beiträge
    396
    Es geht schon mit sed, alledings siehts dann ein bisschen komplizierter aus:
    Code :
    1
    
    sed -i -e '/key/N;s/\(<key>org.eclipse.cdt.make.core.useDefaultBuildCmd<\/key>.*<value>\)false\(<\/value\)/\1true\2/' .project

    Als Erklärung:
    Zuerst suchen wir nach dem Wort "key", dann fügen wir die nächste Zeile zum aktiven String hinzu.
    Zuletzt kommt dann das Ersetzen über mehrere Zeilen.

    Folgende Seite hilft mir bei Sed Fragen in 99% weiter:
    http://main.rtfiber.com.tw/~changyj/sed/

    Gruss
    Geändert von olqs (31.08.09 um 16:12 Uhr)
     

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 04.05.09, 14:14
  2. Antworten: 5
    Letzter Beitrag: 12.10.07, 15:09
  3. Eine Zeile
    Von rgofi im Forum PHP
    Antworten: 5
    Letzter Beitrag: 14.03.07, 09:07
  4. Antworten: 6
    Letzter Beitrag: 29.01.07, 09:49
  5. Eine View über eine ganze Splitterframe legen
    Von tt5 im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 25.10.05, 13:24