Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Regexp Problem mit sed - mehrere Treffer pro Zeile, Leerzeichen, Umbrüche

  1. #1
    der Dennis
    Gast

    Regexp Problem mit sed - mehrere Treffer pro Zeile, Leerzeichen, Umbrüche

    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:


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

  2. #2
    Registrierter Benutzer
    Registriert seit
    20.07.2003
    Beiträge
    147
    Bei einem Problem kann ich vieleicht helfen:

    Code:
    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.

  3. #3
    der Dennis
    Gast
    Sagi,
    doch, doch, das klappt ganz hervorragend! Vielen Dank dafür! Nur für mein Verständnis, was sagt die regexp genau?

    Code:
    ([^|]*\)
    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

  4. #4
    Registrierter Benutzer
    Registriert seit
    20.07.2003
    Beiträge
    147
    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.

  5. #5
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Übrigens: " | cat " ist sinnlos, kannst du auch einfach weglassen.

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ü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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •