sed über mehr als eine Zeile

Buba235

Erfahrenes Mitglied
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:
<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:
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
 
Hi.

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

Code:
/<key>org.eclipse.cdt.make.core.useDefaultBuildCmd<\/key>/,/<\/value>/{
  s,<value>[^<]*</value>,<value>true</value>,
}
Gruß
 
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.
 
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.
 
Es geht schon mit sed, alledings siehts dann ein bisschen komplizierter aus:
Code:
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
 
Zuletzt bearbeitet:
Zurück