PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Regexp Problem mit sed - mehrere Treffer pro Zeile, Leerzeichen, Umbrüche



der Dennis
11-10-2005, 18:20
Hallo alle,
ich versuche gerade meine Seite auf ein neues CMS umzustellen und sitze jetzt hier mit einem MySQL Dump des alten CMS. Ich möchte nun alle Links die ich in meinem alten System (SnipSnap) hatte, auch in meinem neuen (typo) weiterverwenden. Dazu wollte ich das Markup für Links mit Hilfe von sed ändern. Das ganze soll in meinen MySQL Dump tauchen und dort alles was so ausschaut:

{link:so ein link halt|http://linkziel.de/}

In sowas wandeln:

[so ein link halt](http://linkziel.de/ "so ein link halt")

Zum "üben" habe ich etwas Blindtext erzeugt:



blablala {link:guck ein link|http://link.de} blubber.

Das ist eine längere Zeile {link:delve into DEVONthink|http://www.macdevcenter.com/pub/a/mac/2005/08/26/ten Seiten) oh ja.

Zwei in einer Zeile:
da {link:eins|http://link.de} und da{link:auch|http://link.de}.


{link:Google|http://www.google.de/}


Dem bin ich dann mit folgendem Befehl zu Leibe gerückt:




cat text.txt |sed 's@{link:\(.*\)|\(.*\)}@[\1](\2 "\1")@g' | cat


Das funktioniert aber nur mit einem Link pro Zeile und auch nicht mit einem Link der über eine Zeile gebrochen wird:



blablala [guck ein link](http://link.de "guck ein link") blubber.

Das ist eine l?ngere Zeile {link:delve into DEVONthink|http://www.macdevcenter.com/pub/a/mac/2005/08/26/ten Seiten) oh ja.

Zwei in einer Zeile:
da [eins|http://link.de} und da{link:auch](http://link.de "eins|http://link.de} und da{link:auch").


[Google](http://www.google.de/ "Google")



Dann habe ich eine andere regexp gesucht und bin dann damit noch mal los:


cat text.txt |sed 's@{link:\([^ ][^ ]*.\)|\([^ ][^ ]*.\)}@[\1](\2 "\1")@g' | cat


Das passt dann auch auf mehr als einen Link pro Zeile, aber nicht auf den umgebrochenen und auch nicht mehr auf Links die Leerzeichen enthalten...



blablala {link:guck ein link|http://link.de} blubber.

Das ist eine l?ngere Zeile {link:delve into DEVONthink|http://www.macdevcenter.com/pub/a/mac/2005/08/26/ten Seiten) oh ja.

Zwei in einer Zeile:
da [eins](http://link.de "eins") und da[auch](http://link.de "auch").


[Google](http://www.google.de/ "Google")


Und da weiß ich nun nicht mehr weiter...

Kann mir hier vielleicht irgend jemand auf die Sprünge helfen wie ich die regexp schreiben kann, das das auch mit mehreren Links pro Zeile und Leerzeichen und Umbrüchen klappt?

Vielen, vielen Dank schon einmal.

der Dennis

sagi
11-10-2005, 19:12
Bei einem Problem kann ich vieleicht helfen:


sed -e 's@{link:\([^|]*\)|\([^|]*\)}@[\1](\2 "\1")@g'

Dann klappt das mal mit den Leerzeichen

Bei den Zeilenumbrüchen bin ich leider überfragt.

mfg
c.

der Dennis
12-10-2005, 17:58
Sagi,
doch, doch, das klappt ganz hervorragend! Vielen Dank dafür! Nur für mein Verständnis, was sagt die regexp genau?


([^|]*\)

So wie ich es verstehe: Die runden Klammern sind nur zum addressieren da, dann kommt eine Menge aus Zeichen in den eckigen Klammern die wegen dem folgenden Sternchen beliebig oft vorkommen darf.

Die Zeichenmenge selber ist ^| und da weiss ich nicht was das genau sein soll... Ich dachte immer das ^ steht für den Zeilenanfang...

Nochmals vielen Dank.

der Dennis

sagi
12-10-2005, 18:41
Die eckigen Klammern bedeuten, dass an der Stelle einies der Zeichen aus den Klammern vorkommen darf. Mit einem ^ davor wird die Logik negiert (_nur_ in eckigen Klammern)

[^|] bedeutet also: alles abgesehn von |

mit dem Asterisk ist dann alles bis zum nächsten vorkommen des Zeichens gemeint.

wenn der text also "a|b|c" lautet bekommst du mit /^([^|]*)|/ liefert in \1 "a", wogegen /^(.*)|/ "a|b" zutrifft.

mfg
c.

Joghurt
13-10-2005, 13:28
Übrigens: " | cat " ist sinnlos, kannst du auch einfach weglassen.

peschmae
13-10-2005, 13:59
Übrigens:
cat text.txt |
ist auch sinnlos. Kannst du auch weglassen d.h. durch ein sed "s### text.txt" oder auch ein sed "s### < text.txt" ersetzen

MfG Peschmä