# sed über mehr als eine Zeile



## Buba235 (7. August 2009)

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:


```
<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:


```
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


----------



## deepthroat (7. August 2009)

Hi.

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


```
/<key>org.eclipse.cdt.make.core.useDefaultBuildCmd<\/key>/,/<\/value>/{
  s,<value>[^<]*</value>,<value>true</value>,
}
```
Gruß


----------



## Buba235 (7. August 2009)

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.


----------



## Navy (9. August 2009)

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.


----------



## deepthroat (17. August 2009)

Hi.

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

Gruß


----------



## olqs (31. August 2009)

Es geht schon mit sed, alledings siehts dann ein bisschen komplizierter aus:

```
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


----------

