Re: Neues Problem mit RegExp (was Re: suche regexp)

2006-06-22 Diskussionsfäden Matthias Houdek
Hallo Michael Bienia, hallo auch an alle anderen

Mittwoch, 21. Juni 2006 12:34 - Michael Bienia wrote:
>
> 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.

OK, danke.

Lookahead und Lookbehind kannte ich noch nicht. Ist aber sehr 
interessant und wird mir sicherlich auch in Perl-Scripten sehr nützlich 
werden. Hoffentlich wird es bald auch von anderen Toola mit 
aufgenommen, da der "Verbrauch" von Zeichen, auf die man später wieder 
zugreifen will, doch ab und zu mal vorkommt. Und so kann man den ja 
wunderbar unterbinden.

-- 
Gruß
MaxX

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



Re: suche regexp

2006-06-21 Diskussionsfäden Andreas Pakulat
On 21.06.06 15:45:19, Bjoern Schliessmann wrote:
> Andreas Pakulat wrote:
> 
> > Ich mag Python auch lieber, aber fuer ein paar
> > Such/Ersetzungsauftraege mit Regexp ist Perl deutlich besser
> > geeignet.
> 
> Ernsthaft, warum ist Perl hier besser geeignet -- ist der Quelltext
> kürzer oder die Performance besser?

Der Quelltext ist deutlich kuerzer, da Suchen-Ersetzen mit Regex in die
Sprache eingebaut ist und nicht ueber ein separates modul (das erst
importiert werden muss) realisiert wird. Ein Perl-Skript auf der
Kommandozeile ist fast genausolang wie dasselbe mit sed.

Ob es schneller ist, weiss ich nicht, weil ich dazu keinerlei Daten
habe.

Andreas

-- 
Today's weirdness is tomorrow's reason why.
-- Hunter S. Thompson


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: suche regexp

2006-06-21 Diskussionsfäden Helmut Wollmersdorfer

Bjoern Schliessmann wrote:


Schnüff. Ich hab Angst vor Perl ;)


Wieso? Beisst nicht und ist nicht giftig.


Ernsthaft, warum ist Perl hier besser geeignet -- ist der Quelltext
kürzer oder die Performance besser?


Beides.

Perl hat z.B. 'automatische Variablen', wo man in Python ein 
Match-Object verwenden muss/kann. Dadurch hat man in Perl weniger zu 
tippseln. Nachteil ist der erhöhte Lernaufwand und weniger 
selbsterklärender Code gegenüber Python. Python ist 'schön' und 
systematisch, Perl 'praktisch' (und hässlich).


Warum ich Python nicht verwende? Weil ich es noch nicht erlernt habe;-)

Helmut Wollmersdorfer


--
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/


Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: suche regexp

2006-06-21 Diskussionsfäden Bjoern Schliessmann
Andreas Pakulat wrote:

> Ich mag Python auch lieber, aber fuer ein paar
> Such/Ersetzungsauftraege mit Regexp ist Perl deutlich besser
> geeignet.

Schnüff. Ich hab Angst vor Perl ;)

Ernsthaft, warum ist Perl hier besser geeignet -- ist der Quelltext
kürzer oder die Performance besser?

Grüße,


Björn

-- 
BOFH excuse #103:

operators on strike due to broken coffee machine


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Neues Problem mit RegExp (was Re: suche regexp)

2006-06-21 Diskussionsfäden Michael Bienia
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


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Neues Problem mit RegExp (was Re: suche regexp)

2006-06-20 Diskussionsfäden Roland M. Kruggel
Am Mittwoch, 21. Juni 2006 07:58 schrieb Matthias Houdek:
> 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.

Habe ich auch gestern festgestellt. Ich habe ihn einfach zweimal 
durchlaufen lassen. :) Nicht elegant, aber funktionell :)

-- 
cu

Roland Kruggel  mailto: rk.liste at bbf7.de
System: Intel, Debian etch, 2.6.16.16, xfce4 KDE 3.5



Neues Problem mit RegExp (was Re: suche regexp)

2006-06-20 Diskussionsfäden Matthias Houdek
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?

-- 
Gruß
MaxX

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



Re: suche regexp

2006-06-20 Diskussionsfäden Andreas Pakulat
On 21.06.06 00:11:56, Bjoern Schliessmann wrote:
> Roland M. Kruggel wrote:
> 
> > Perl hört sich gut an.
> 
> 
> Python! Python! :) 
> http://www.python.org/
> 

Ich mag Python auch lieber, aber fuer ein paar Such/Ersetzungsauftraege
mit Regexp ist Perl deutlich besser geeignet.

Andreas

-- 
Communicate!  It can't make things any worse.


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: suche regexp

2006-06-20 Diskussionsfäden Bjoern Schliessmann
Roland M. Kruggel wrote:

> Perl hört sich gut an.


Python! Python! :) 
http://www.python.org/


Grüße,


Björn

-- 
BOFH excuse #141:

disks spinning backwards - toggle the hemisphere jumper.


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: suche regexp

2006-06-20 Diskussionsfäden Roland M. Kruggel
Am Dienstag, 20. Juni 2006 20:07 schrieb Matthias Houdek:
> Damit vereinfacht sich det Janze natürlich wieda, wa:
>
> sed -r 's/(^|\|)([0-9]+)\.([0-9]{1,2}\|)/\1\2,\3/g' $oldfile >
> $newfile

Ich habe mich zu dieser Variante entschieden. 
Recht herzlichen Dank an alle Beteiligten. Ihr habt mir sehr geholfen 
und ich habe wieder viel dazugelernt. Vllt. verstehe ich ja 
irgendwann die regexp richtig. Ihr habt mich jedenfalls ein grosses 
stück weiter gebracht.

-- 
cu

Roland Kruggel  mailto: rk.liste at bbf7.de
System: Intel, Debian etch, 2.6.16.16, xfce4 KDE 3.5



Re: suche regexp

2006-06-20 Diskussionsfäden Matthias Houdek
Hallo Christian Frommeyer, hallo auch an alle anderen

Dienstag, 20. Juni 2006 19:03 - Christian Frommeyer wrote:
> Am Dienstag 20 Juni 2006 18:03 schrieb Matthias Houdek:
> > *Argh* - bei sed sind es mal wieder Basic-RegExp, also immer schön
> > ein Backslash vor die Klammern und das Oder-Zeichen "|".
>
> sed -r ist Dein Freund ;)

Danke.

Ich nutze sed in letzter Zeit selten. Ein Blick in die Manpage brachte 
mir:

$ man sed | grep -r '^ *-\?r' -A 3
Formatiere sed(1) neu, bitte warten...
[...]
   r Datei
  der Inhalt der Datei wird ausgegeben, bevor die nächste
  Zeile gelesen wird

Werde wohl doch endlich mal die deutschen Manpages wieder 
runterschmeißen, weil hier:

[EMAIL PROTECTED]:~# man -L en sed | grep -r '^ *-\?r' -A 3
Reformatting sed(1), please wait...
   -r, --regexp-extended
  use extended regular expressions in the script.
[...]
   r filename
  Append text read from filename.

Auch die Option 'r filename' verstehe ich anders als die deutsche 
Übersetzung (die ich ehrlich gesagt überhaupt nicht so richtig 
verstehe).

*grmpfrg*

Damit vereinfacht sich det Janze natürlich wieda, wa:

sed -r 's/(^|\|)([0-9]+)\.([0-9]{1,2}\|)/\1\2,\3/g' $oldfile > $newfile

-- 
Gruß
MaxX

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



Re: suche regexp

2006-06-20 Diskussionsfäden Matthias Houdek
Hallo Thorsten Haude, hallo auch an alle anderen

Dienstag, 20. Juni 2006 19:39 - Thorsten Haude wrote:
> Moin,
>
> * Matthias Houdek wrote (2006-06-20 16:51):
> >Dienstag, 20. Juni 2006 16:21 - Thorsten Haude wrote:
> >> * Thorsten Haude wrote (2006-06-20 16:11):
> >> >s/((^|\|)/\d*)\.(\d{1,2}|)/\1,\2/
> >>
> >> Falsch so sollte es gehen:
> >> s/(^|\|)(\d*)\.(\d{1,2}|)/\2,\3/
> >
> >Autsch, das geht auch daneben. ;-)
> >
> >Das lässt den | vor den Vorkommastellen unter den Tisch fallen.
>
> Ach ja, den brauchen wir ja auch noch.
>
> >RegExp sind was tolles, aber man muss auch höllisch aufpassen und
> > auf jeden Fall ausgiebig testen, bevor man an wichtige Daten
> > rangeht.
>
> Ja, danke, weiß ich. Normalerweise mache ich das auch nicht trocken.

Gut, dass ich dann doch ein wenig probiert habe. Hab dabei sogar noch 
was dazugelernt (oder wiederentdeckt? - muss mir mal ein paar uralte 
Scripte von mir rauskramen). 

-- 
Gruß
MaxX

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



Re: suche regexp

2006-06-20 Diskussionsfäden Thorsten Haude
Moin,

* Roland M. Kruggel wrote (2006-06-20 16:27):
>Am Dienstag, 20. Juni 2006 16:11 schrieb Thorsten Haude:
>> Ergebnis:
>> /(^|\|)/\d*\.\d{1,2}|/
> ^
>ist dann nicht der zuviel?

Stimmt, keine Ahnung, wo der herkommt.


>Wäre es unverschämt von mir, wenn ich um einen perlaufruf bitten 
>würde. Dann könnte ich mir ein bash-script bauen das die ganzen 58 
>File nacheinander abklappert.

Warum die Mühe? Gibt es irgendetwas, das Bash kann, Perl aber nicht?


Thorsten
-- 
He who receives an idea from me, receives instruction himself without lessening
mine; as he who lights his taper at mine, receives light without darkening me.
- Thomas Jefferson


pgpjOarRyDvXO.pgp
Description: PGP signature


Re: suche regexp

2006-06-20 Diskussionsfäden Thorsten Haude
Moin,

* Matthias Houdek wrote (2006-06-20 16:51):
>Dienstag, 20. Juni 2006 16:21 - Thorsten Haude wrote:
>> * Thorsten Haude wrote (2006-06-20 16:11):
>> >s/((^|\|)/\d*)\.(\d{1,2}|)/\1,\2/
>>
>> Falsch so sollte es gehen:
>> s/(^|\|)(\d*)\.(\d{1,2}|)/\2,\3/
>
>Autsch, das geht auch daneben. ;-)
>
>Das lässt den | vor den Vorkommastellen unter den Tisch fallen. 

Ach ja, den brauchen wir ja auch noch.


>RegExp sind was tolles, aber man muss auch höllisch aufpassen und auf 
>jeden Fall ausgiebig testen, bevor man an wichtige Daten rangeht.

Ja, danke, weiß ich. Normalerweise mache ich das auch nicht trocken.


Thorsten
-- 
Omnis enim res, quae quando non deficit, dum habetur
et non datur, nondum habetur, quomodo habenda est.
- Aurelius Augustinus


pgpWYftW6SQRO.pgp
Description: PGP signature


Re: suche regexp

2006-06-20 Diskussionsfäden Christian Frommeyer
Am Dienstag 20 Juni 2006 18:03 schrieb Matthias Houdek:
> *Argh* - bei sed sind es mal wieder Basic-RegExp, also immer schön
> ein Backslash vor die Klammern und das Oder-Zeichen "|".

sed -r ist Dein Freund ;)

Gruß Chris

-- 
A: because it distrupts the normal process of thought
Q: why is top posting frowned upon



Re: suche regexp

2006-06-20 Diskussionsfäden Matthias Houdek
Hallo Matthias Houdek, hallo auch an alle anderen

Dienstag, 20. Juni 2006 16:56 - Matthias Houdek wrote:
> Hallo Roland M. Kruggel, hallo auch an alle anderen
>
> Dienstag, 20. Juni 2006 16:27 - Roland M. Kruggel wrote:
> > Am Dienstag, 20. Juni 2006 16:11 schrieb Thorsten Haude:
> > > Moin,
> > >
> > > * Roland M. Kruggel wrote (2006-06-20 14:28):
> > > >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.
> > >
> > > Also:
> > > Zeilenanfang oder | (^||)
> > > dann beliebig viele Ziffern \d*
> > > dann ein Punkt  \.
> > > dann ein oder zwei Ziffern  \d{1,2}
> > > dann ein |  |
> >
> > Verstanden
> >
> > > Ergebnis:
> > > /(^|\|)/\d*\.\d{1,2}|/
> >
> >  ^
> > ist dann nicht der zuviel?
> >
> > > Wenn die Zahlen wie in Deutschland üblich immer eine
> > > Vorkommastelle haben sollen, dann mußt Du den * durch ein +
> > > ersetzen.
> > >
> > > Wie Du den Punkt ersetzt hängt von der Umgebung und Deinen
> > > Vorlieben ab. In Perl zB. so ungefähr:
> > > s/((^|\|)/\d*)\.(\d{1,2}|)/\1,\2/
> >
> > Perl hört sich gut an.
> > Wäre es unverschämt von mir, wenn ich um einen perlaufruf bitten
> > würde. Dann könnte ich mir ein bash-script bauen das die ganzen 58
> > File nacheinander abklappert.
>
> Wenn du es mit einem Bash-Script machen willst, dann nimm doch sed.
>
> oldfile = ""
> newfile = ""
> sed 's/(^|\|)(\d+)\.(\d{1,2}\|)/\1\2,\3/g' $oldfile > $newfile

*Argh* - bei sed sind es mal wieder Basic-RegExp, also immer schön ein 
Backslash vor die Klammern und das Oder-Zeichen "|".

sed 's/\(^\||\)\([0-9]*\)\.\([0-9]\{1,2\}|\)/\1\2,\3/g' $oldfile > 
$newfile

> Das kannst du dir jetzt noch schön in eine Schleife einbasteln ;-)
>
> Und testen! Weil: Wie immer ohne Gewähr *g*

Hab ich gerade getestet, sollte klappen. Zumindest, solange auch das 
letzte Datenfeld mit einem "|" abgeschlossen wird (in deiner ersten 
Mail stand es so).

Ansonsten sollte das hier klappen (ist ergänzt um das Zeilenende als 
möglichen Feldabschluss):

sed 's/\(^\||\)\([0-9]*\)\.\([0-9]\{1,2\}\)\(|\|$\)/\1\2,\3\4/g' 
$oldfile > $newfile

(alles in eine Zeile)

-- 
Gruß
MaxX

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



Re: suche regexp

2006-06-20 Diskussionsfäden Helmut Wollmersdorfer

Roland M. Kruggel wrote:


Perl hört sich gut an.
Wäre es unverschämt von mir, wenn ich um einen perlaufruf bitten 
würde. Dann könnte ich mir ein bash-script bauen das die ganzen 58 
File nacheinander abklappert.


In Perl kannst auch Files mit einer Schleife durchlaufen, bzw. ganze 
sogar ganze Hierarchien von Verzeichnissen.


Eine entsprechende Subroutine in Perl sieht etwa so aus:

sub read_files {
my (
$dir,
$sub_dir,
$file_extension,
$hash_ref
) = @_;

my $current_dir = check_dir ($dir);
local(*CURDIR);

print STDERR "opening dir \"$current_dir\" for read\n"  if $VERBOSE 
>= 2;
opendir(CURDIR,"$current_dir") or die "Can't open directory 
\"$current_dir\"\n";

#rewinddir(DIR);
print STDERR "selecting files\n"  if $VERBOSE >= 3;
my @entries = readdir CURDIR ;
#my @files = grep {/^.+\.$file_extension$/} readdir CURDIR ;
closedir (CURDIR);

#print "dir entries \t [ @files ] \n"  if $VERBOSE >= 3;

for my $dir_entry ( sort @entries ) {
my $target = $current_dir . $dir_entry;

if ( $dir_entry =~ m/^$file_extension$/ ) {
read_file ($current_dir, $dir_entry, $hash_ref) if -f $target;
}
else {
if ( $dir_entry =~ m/^(\.\w|\w).*$/ ) {
read_files ($target, $sub_dir, 
$file_extension,$hash_ref ) if -d $target;

}
}
}
}

Bei komplexeren Sachen ist Perl halt flexibler, aber das Erlernen zahlt 
sich aus.


In Deinem Fall würde ein Shell-Script mit den üblichen Utilities auch 
reichen. Ist halt eine Geschmacksfrage, ob man sich tiefer in bash & co 
oder lieber gleich in Perl einarbeitet.


Mir war für das Umformatieren sed, awk, find, sort, tr, uniq etc. auf 
die Dauer zu mühsam, weshalb ich Perl bevorzuge.


Helmut Wollmersdorfer


--
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/


Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: suche regexp

2006-06-20 Diskussionsfäden Matthias Houdek
Hallo Roland M. Kruggel, hallo auch an alle anderen

Dienstag, 20. Juni 2006 16:27 - Roland M. Kruggel wrote:
> Am Dienstag, 20. Juni 2006 16:11 schrieb Thorsten Haude:
> > Moin,
> >
> > * Roland M. Kruggel wrote (2006-06-20 14:28):
> > >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.
> >
> > Also:
> > Zeilenanfang oder | (^||)
> > dann beliebig viele Ziffern \d*
> > dann ein Punkt  \.
> > dann ein oder zwei Ziffern  \d{1,2}
> > dann ein |  |
>
> Verstanden
>
> > Ergebnis:
> > /(^|\|)/\d*\.\d{1,2}|/
>
>  ^
> ist dann nicht der zuviel?
>
> > Wenn die Zahlen wie in Deutschland üblich immer eine Vorkommastelle
> > haben sollen, dann mußt Du den * durch ein + ersetzen.
> >
> > Wie Du den Punkt ersetzt hängt von der Umgebung und Deinen
> > Vorlieben ab. In Perl zB. so ungefähr:
> > s/((^|\|)/\d*)\.(\d{1,2}|)/\1,\2/
>
> Perl hört sich gut an.
> Wäre es unverschämt von mir, wenn ich um einen perlaufruf bitten
> würde. Dann könnte ich mir ein bash-script bauen das die ganzen 58
> File nacheinander abklappert.

Wenn du es mit einem Bash-Script machen willst, dann nimm doch sed.

oldfile = ""
newfile = ""
sed 's/(^|\|)(\d+)\.(\d{1,2}\|)/\1\2,\3/g' $oldfile > $newfile

Das kannst du dir jetzt noch schön in eine Schleife einbasteln ;-)

Und testen! Weil: Wie immer ohne Gewähr *g*

-- 
Gruß
MaxX

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



Re: suche regexp

2006-06-20 Diskussionsfäden Matthias Houdek
Hallo Thorsten Haude, hallo auch an alle anderen

Dienstag, 20. Juni 2006 16:21 - Thorsten Haude wrote:
> Moin,
>
> * Thorsten Haude wrote (2006-06-20 16:11):
> >s/((^|\|)/\d*)\.(\d{1,2}|)/\1,\2/
>
> Falsch so sollte es gehen:
> s/(^|\|)(\d*)\.(\d{1,2}|)/\2,\3/

Autsch, das geht auch daneben. ;-)

Das lässt den | vor den Vorkommastellen unter den Tisch fallen. 

RegExp sind was tolles, aber man muss auch höllisch aufpassen und auf 
jeden Fall ausgiebig testen, bevor man an wichtige Daten rangeht.

-- 
Gruß
MaxX

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



Re: suche regexp

2006-06-20 Diskussionsfäden Matthias Houdek
Hallo Roland M. Kruggel, hallo auch an alle anderen

Dienstag, 20. Juni 2006 15:58 - Roland M. Kruggel wrote:
> > > 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
>
> Megagei. :)
> Ich frage jetzt nicht nach dem Wie. Hut ab, Michael.
> Danke.

Vorsicht! Nicht ungetestet übernehmen.

1. Viele RegExp-Dialekte interpretieren \( bzw \) als das jeweilige 
Klammerzeichen. Die Klammer zum Gruppieren darf dann nicht hinter einem 
Backslash stehen.

2. Zur Erklärung (muss man sich mal mit befassen, ist gar nicht soo 
schwer):

s bedeutet: Tausche das, was nach dem nächsten Delimiter (hier: "/") 
steht, gegen das, was nach dem 2. Delimiter steht. Das g hinter dem 3. 
Delimiter heißt, dass das ganze global erfolgen soll.

Im ersten Bereich steht eine Klammer zur Gruppierung und in der Klammer 
das \d für ein Digit (Ziffer 0..9) und das + danach für mind. 1 Mal. 
Danach folgt ein Punkt (mit einem vorangestellten Backslash, sonst 
steht er für ein beliebiges Zeichen). Danach folgt eine zweite 
Klammergruppierung, in der ein Digit oder (dargestellt durch "|") zwei 
Digits stehen können, gefolgt von dem "|" als dein Datenbankdelimiter.

Jede Zeichenfolge, auf die diese Beschreibung zutrifft (mind. 1 Ziffer, 
dann ein Punkt, dann 1 oder 2 Ziffern und das "|"), wird nun durch das 
Folgende ersetzt (steht nach dem zweiten /):

\1 schreibt alles, auf das die erste Klammergruppierung passte. Danach 
kommt das Komma und dann mit \2 alles, auf das die 2. 
Klammergruppierung zutraf.

Ich hoffe, du findest mit dieser kleinen Beschreibung Gefallen an der 
Mächtigkeit Regulärer Ausdrücke ;-)

Eine Alternative (aber auch ohne Gewähr, bitte vorher testen) findest du 
in meiner anderen Mail.

-- 
Gruß
MaxX

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



Re: suche regexp

2006-06-20 Diskussionsfäden Matthias Houdek
Hallo Matthias Houdek, hallo auch an alle anderen

Dienstag, 20. Juni 2006 16:12 - Matthias Houdek wrote:
> [...]
> s/((^|\|)\d+).(\d{1,2}\|)/\1,\3/g
  ^^
Urps, da muss natürlich noch ein Backslash vor den Punkt.

-- 
Gruß
MaxX

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



Re: suche regexp

2006-06-20 Diskussionsfäden Roland M. Kruggel
Am Dienstag, 20. Juni 2006 16:11 schrieb Thorsten Haude:
> Moin,
>
> * Roland M. Kruggel wrote (2006-06-20 14:28):
> >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.
>
> Also:
> Zeilenanfang oder | (^||)
> dann beliebig viele Ziffern \d*
> dann ein Punkt  \.
> dann ein oder zwei Ziffern  \d{1,2}
> dann ein |  |

Verstanden

> Ergebnis:
> /(^|\|)/\d*\.\d{1,2}|/
 ^
ist dann nicht der zuviel?

> Wenn die Zahlen wie in Deutschland üblich immer eine Vorkommastelle
> haben sollen, dann mußt Du den * durch ein + ersetzen.
>
> Wie Du den Punkt ersetzt hängt von der Umgebung und Deinen
> Vorlieben ab. In Perl zB. so ungefähr:
> s/((^|\|)/\d*)\.(\d{1,2}|)/\1,\2/

Perl hört sich gut an.
Wäre es unverschämt von mir, wenn ich um einen perlaufruf bitten 
würde. Dann könnte ich mir ein bash-script bauen das die ganzen 58 
File nacheinander abklappert.


-- 
cu

Roland Kruggel  mailto: rk.liste at bbf7.de
System: Intel, Debian etch, 2.6.16.16, xfce4 KDE 3.5



Re: suche regexp

2006-06-20 Diskussionsfäden Thorsten Haude
Moin,

* Thorsten Haude wrote (2006-06-20 16:11):
>s/((^|\|)/\d*)\.(\d{1,2}|)/\1,\2/

Falsch so sollte es gehen:
s/(^|\|)(\d*)\.(\d{1,2}|)/\2,\3/


Thorsten
-- 
Why do we drink cow's milk? Who was the first guy who first
looked at a cow and said "I think I'll drink whatever comes
out of these things when I squeeze 'em!"?
- Calvin


pgpb2uU6KYnz9.pgp
Description: PGP signature


Re: suche regexp

2006-06-20 Diskussionsfäden Thorsten Haude
Moin,

* Matthias Houdek wrote (2006-06-20 16:12):
>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
   ^
Da war ich mir nicht so sicher, ob das gebraucht wird.


>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 "|".

Da war ich auch falsch.


Thorsten
-- 
I'd rather have friends who care than friends who agree with me.
- Arlo Guthrie


pgpgcqsGa8spf.pgp
Description: PGP signature


Re: suche regexp

2006-06-20 Diskussionsfäden Thorsten Haude
Moin,

* Roland M. Kruggel wrote (2006-06-20 14:28):
>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.

Also:
Zeilenanfang oder | (^||)
dann beliebig viele Ziffern \d*
dann ein Punkt  \.
dann ein oder zwei Ziffern  \d{1,2}
dann ein |  |

Ergebnis:
/(^|\|)/\d*\.\d{1,2}|/

Wenn die Zahlen wie in Deutschland üblich immer eine Vorkommastelle
haben sollen, dann mußt Du den * durch ein + ersetzen.

Wie Du den Punkt ersetzt hängt von der Umgebung und Deinen Vorlieben
ab. In Perl zB. so ungefähr:
s/((^|\|)/\d*)\.(\d{1,2}|)/\1,\2/


Thorsten
-- 
Anyone who is capable of getting themselves made President
should on no account be allowed to do the job.
- The Book


pgpfjZcanBJOl.pgp
Description: PGP signature


Re: suche regexp

2006-06-20 Diskussionsfäden Roland M. Kruggel
Am Dienstag, 20. Juni 2006 14:51 schrieb Michael Ott:
> > 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

Eine Klitzekleinigkeit bittr noch.
Da es sich um mehrere Dateien handelt (ca. 50) wollte ich eine map ind 
der .vimrc definieren.

map  :%s/\(\d\+\)\.\(\(\d\|\d\d\)|\)/\1,\2/g

geht schief. Mit der Fehlermeldung
--->
[EMAIL PROTECTED]:~/develop/keim/keim.exp$ vi kalk200161.unl
Fehler beim Ausführen von "/home/rkruggel/.vimrc":
Zeile   11:
E10: \ sollte von /, ? or & gefolgt werden
Drücken Sie die EINGABETASTE oder geben Sie einen Befehl ein
---<

Du hast doch bestimmt eine Lösung auch für dieses Problem :)

-- 
cu

Roland Kruggel  mailto: rk.liste at bbf7.de
System: Intel, Debian etch, 2.6.16.16, xfce4 KDE 3.5



Re: suche regexp

2006-06-20 Diskussionsfäden Matthias Houdek
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.



Re: suche regexp

2006-06-20 Diskussionsfäden Roland M. Kruggel

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

Megagei. :)
Ich frage jetzt nicht nach dem Wie. Hut ab, Michael. 
Danke.

-- 
cu

Roland Kruggel  mailto: rk.liste at bbf7.de
System: Intel, Debian etch, 2.6.16.16, xfce4 KDE 3.5



Re: suche regexp

2006-06-20 Diskussionsfäden Michael Ott
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

CU
 
  Michael  
  
-- 
,''`.   Michael Ott, e-mail: michael at zolnott dot de
   : :' :   Debian SID on Thinkpad T43: 
   `. `'http://www.zolnott.de/laptop/ibm-t43-uc34nge.html 
 `- 
Jeden Mittwoch von 21 - 24 Uhr. Zosh! auf Radio Z. 
Das Härteste, was der Musikmarkt zu bieten hat. http://www.zosh.de
Online hören: http://www.radio-z.net 



suche regexp

2006-06-20 Diskussionsfäden Roland M. Kruggel
Hallo Liste,

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

Die Felder die geändert werden müssen habe ich mit einem '+' 
gekennzeichnet, die die nicht geändert werden dürfen mit einem '-'.

Danke schon mal im vorraus.


-- 
cu

Roland Kruggel  mailto: rk.liste at bbf7.de
System: Intel, Debian etch, 2.6.16.16, xfce4 KDE 3.5