Re: Neues Problem mit RegExp (was Re: suche regexp)
On 2006-06-21 07:58:57 +0200, Matthias Houdek wrote:
> Hallo
>
> Dienstag, 20. Juni 2006 20:07 - Matthias Houdek wrote:
> > [Ersetzen von Dezimalpunkt durch Dezimalkomma in rein numerischen
> > Feldern in folgender Struktur (z.B.) bei ein oder zwei
> > Nachkommastellen:
> > sd34.43|232232.22|2345.4|324234.324|2323.45|123.41|
> > ]
> >
> > sed -r 's/(^|\|)([0-9]+)\.([0-9]{1,2}\|)/\1\2,\3/g' $file
>
> Dieser RegExp macht zwar das Gewünschte, auch wenn das numerische Feld
> am Zeilenanfang steht.
>
> Allerdings erfolgt der Wechsel nicht in zwei aufeinanderfolgenden
> numerischen Feldern (hier z.B. Felder 2 und 3). Ursache dafür ist, dass
> der abschließende Delimiter eines Feldes mit erfasst wird|werden muss
> und damit nicht mehr als Einleitung für das nächste Feld aufgenommen
> wird. Damit trifft der RegExp für das nachfolgende Feld nicht mehr zu.
>
> Nun kann man ja diesen sed-Befehl 2 x über die Datei laufen lassen, dann
> würden auch die im ersten Durchlauf nicht erfassten geändert. Oder man
> verdoppelt zuvor alle Feld-Delimiter.
>
> Gibt es keine andere Möglichkeit?
Mit Lookaround-Zusicherungen wie sie z.B. Perl kennt:
s/(?:^|(?<=\|))(\d+)\.(\d\d?\|)/\1,\2/g
Hier wird eine Lookbehind-Zusicherung genutzt, um nachzusehen, ob vor
den Zahlen ein | ist. Eine andere Möglichkeit wäre über eine
Lookahead-Zusicherung nachzusehen, ob nach dem Punkt eine oder zwei
Ziffern und ein | folgen:
s/((^|\|)\d+)\.(?=\d\d?\|)/\1,/g
sed kennt wowas nicht, also wirst du wohl auf Perl umsteigen müssen.
Michael
Reply to: