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

Re: suche regexp



Hallo Michael Ott, hallo auch an alle anderen

Dienstag, 20. Juni 2006 14:51 - Michael Ott wrote:
> Hallo Roland!
>
> > ich brauche mal die spezialisten für regexp, sed, awk oder
> > ähnliches.
> >
> > Folgendes Problem tritt bei einer Konvertierung einer Datenbank
> > auf. Es gibt folgende Datensätze ind dieser und ähnlicher Form.
> > Delimiter ist immer '|'
> >
> > --->
> > 30102136030.0|20|30102|silo 22.0|136|30|1|
> >            +                  -
> > GH-Schale 7086.00 782|10.0|7421|0|stk|33,83|0,00|
> >               -
> > 0,00|0.0|33,83|2.0|26.03.2001|1.0|30102|121|1|
> >       +         +    -  -      +
> > kroeger|2001-03-26 15:55:22|102|||1|0|0|
> > ---<
> >
> > Ich muss jetzt in einigen Felder den Punkt durch ein Komma
> > ersetzen. Eigentlich trivial wenn da nicht das Datum und das
> > Textfeld drin wäre. Dort müssen die Punkte bleiben.
> >
> > Gemeinsamkeiten der Decimalfelder:
> > * nur zahlen
> > * beliebige Vorkomma-Stellen
> > * eine oder zwei Nachkommastellen
> > * am ende immer ein '|'
> > * immer ein Punkt als Dezimalzeichen
>
> vim:
> :%s/\(\d\+\)\.\(\(\d\|\d\d\)|\)/\1,\2/g

auf gut Deutsch:

tausche (mind. 1 Ziffer).(Ziffer od. 2 Ziffern und "|") gegen (Inhalt 
der 1. Klammer),(Inhalt der 2. Klammer) - und das überall

Das träfe auch auf "silo 22.0" zu. Außerdem wäre IMHO für die 2. Klammer 
(die Nachkommastellen) folgendes einfacher: (\d{1,2}\|)

Folgendes sollte es aber treffen (ungetestet, ggf. die Syntax je nach 
verwendetem Dialekt anpassen, z.B. Klammern "escapen" wie oben):

s/((^|\|)\d+).(\d{1,2}\|)/\1,\3/g

Meiner Meinung nach sollte hier nach dem Komma der Inhalt der 3. Klammer 
kommen (\3), denn die 2. Klammer enthält ja den Zeilenanfang oder den 
vorhergehenden "|".

hth

-- 
Gruß
                MaxX

Bitte beachten: Diese Mailadresse nimmt nur Listenmails entgegen.
Für PM bitte den Empfänger gegen den Namen in der Sig tauschen.



Reply to: