[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: