# gnu sed; lazy/greedy quantifier



## fm5326 (18. November 2007)

Hallo,
mit gnu sed möchte ich folgende Konvertierung durchführen:

Input string:
startAAAstopBBBstartCCCstopDDD
stopAAAstartBBBstopCCCstartDDD

Gewünschtes Ergebnis:
beginAAAendBBBbeginCCCendDDD
stopAAAbeginBBBendCCCstartDDD

Mein regexp:
s/start\(.*\)stop/begin\1end/g

ergibt leider das fehlerhafte Resultat:
beginAAAstopBBBstartCCCendDDD
stopAAAbeginBBBendCCCstartDDD

Ich habe in einem Tutorial über den lazy/greedy quantifier ? gelesen und
viele Varianten damit ausprobiert - leider ohne Erfolg.

Ich würde mich sehr freuen, wenn mir jemand einen Tip geben könnte.


----------



## Dennis Wronka (19. November 2007)

Du koennstest mit -e mehrere Expressions angeben. So geh ich das an wenn ich verschiedene Sachen zu ersetzen habe.

```
echo "irgendeintext" | sed -e 's@alt1@neu1@g' -e 's@alt2@neu2@g'
```


----------



## olqs (19. November 2007)

Als erster Test von mir, kam diese regexp raus:

```
sed 's.start\([^s]*[^t][^o][^p]\)stop.begin\1end.g'
```
Es geht aber sicher noch eleganter.

Zu sed find ich diese Seite nicht schlecht:http://main.rtfiber.com.tw/~changyj/sed/
Da ist ziemlich viel anhand von Beispielen erklärt.


----------



## fm5326 (19. November 2007)

Danke für Eure Vorschläge und den Link.
gnu sed scheint den lazy quantifier ? nicht zu unterstützen.

Mit PowerGrep funktioniert es nämlich wie erwartet:

Zunächst 'greedy'
search: start(.*)stop
replacement: begin\1end
Matches:
startAAAstopBBBstartCCCstopDDD
stopAAAstartBBBstopCCCstartDDD
Ergebnis:
beginAAAstopBBBstartCCCendDDD
stopAAAbeginBBBendCCCstartDDD

Und hier 'lazy':
search: start(.**?*)stop
replacement: begin\1end
startAAAstopBBBstartCCCstopDDD
stopAAAstartBBBstopCCCstartDDD
Ergebnis:
beginAAAendBBBbeginCCCendDDD
stopAAAbeginBBBendCCCstartDDD


----------

