open+Regular Expressions
Markus
- perl
Hallo, erst einmal alles gute zum 10-jährigen.
Ich habe folgendes Problem, ich möchte Meherere Dateien meines Arbeitgeber aus diveresen Ordnern nach "Zombie-Dateien" durchsuchen.
Hierzu habe ich u.A. folgenden Code geschrieben
"
$dir = "C:/Dokumente und Einstellungen/eisenhutm/Desktop/SDST/TBDs/bwt";
opendir(BIN, $dir) or die "Can't open $dir: $!";
while( defined ($file = readdir BIN) ) {
if($file=~(/.log/)){
print"$file\n";
$datei=$file;
open(FILE,"C:/Dokumente und Einstellungen/eisenhutm/Desktop/SDST/TBDs/bwt/$datei")|| die"FEHLER:$!\n";
print "Datei : $datei\n\n";
print " -----------------------\n\n";
while($zeile=<FILE>){
if($zeile=~(/.bmp|.BMP|.wav|.WAV/)){
[b]====>FEHLER ****[/b] if($zeile=~(/(.*)"(.*)"/)){
$dat=$2;
print "$dat $zeile";
}
}
}
close(FILE);
}
}
closedir(BIN);
"
Das Programm funktioniert soweit auch und gibts u.A. folgende Zeilen aus :
antwb_12.bmp ItemspezifischeWerte"12",12,"aufwb_12.bmp","antwb_12.bmp"),
Quelle: ItemspezifischeWerte"12",12,"aufwb_12.bmp","antwb_12.bmp"),
also die zu löschenden Dateien und den Pfad
==>PROBLEM, einige Dateien haben folgenden Zeilenaufbau
Quelle : ItemspezifischeWerte("1",1,"auftr_01.bmp"," 63"),
so dass das Programm folgendes ausspuckt:
63 ItemspezifischeWerte("1",1,"auftr_01.bmp"," 63"),
d.h. die 63 und nicht "auftr_01.bmp", habe jetzt seit Stunden probiert den Regulären Ausdruck hinzubekommen aber nichts klappt
In Zeile 1 wird die Datei nach den Zeilen durchsucht die bmp oder wav sind, in der Darunter soll dann die zu löschende Datei ausgegeben werden. Wie muss ich in Zeile 2 ==> "(.*)" verändern so dass er nur .bmp und .wav in Anführungszeichen berücksichtigt? Ich krieg es einfach nicht hin... hoffe ihr könnt mir helfen.
Gruß Markus
Zeile 1 :if($zeile=~(/.bmp|.BMP|.wav|.WAV/)){
Zeile 2 :if($zeile=~(/(.*)"(.*)"/)){
Hi,
ich hab das Problem jetzt nicht genau verstanden, aber suchst du evtl. sowas:
if( $zeile =~ /(.*)"(.wav)"/ || $zeile =~ /(.*)"(.bmp)"/ ){
...
}
HTH, Stefan
Hi,
ich hab das Problem jetzt nicht genau verstanden, aber suchst du evtl. sowas:
if( $zeile =~ /(.*)"(.wav)"/ || $zeile =~ /(.*)"(.bmp)"/ ){
...
}HTH, Stefan
Ok ich habs gelöst ;D
if($zeile=~(/.*"([a-zA-z][a-zA-Z0-9_]*.[bBwW]..)".*/)){
bzw
if($zeile=~(/.*"([a-zA-z][a-zA-Z0-9_]*.(bmp|BMP|wav|WAV))".*/)){
Danke euch trotzdem für eure Mühe ;D
Hierzu habe ich u.A. folgenden Code geschrieben
"
$dir = "C:/Dokumente und Einstellungen/eisenhutm/Desktop/SDST/TBDs/bwt";
Du benutzt nicht strict?
solltest du tun.
opendir(BIN, $dir) or die "Can't open $dir: $!";
while( defined ($file = readdir BIN) ) {
if($file=~(/.log/)){
print"$file\n";
$datei=$file;
Warum nicht:
my $datei = "$dir/$file";
open(FILE,"C:/Dokumente und Einstellungen/eisenhutm/Desktop/SDST/TBDs/bwt/$datei")|| die"FEHLER:$!\n";
Dann sparst du hier das Verzeichniss.
if($zeile=~(/.bmp|.BMP|.wav|.WAV/)){
[b]====>FEHLER ****[/b] if($zeile=~(/(.*)"(.*)"/)){
$dat=$2;
print "$dat $zeile";
Das Programm funktioniert soweit auch und gibts u.A. folgende Zeilen aus :antwb_12.bmp ItemspezifischeWerte"12",12,"aufwb_12.bmp","antwb_12.bmp"),
Das klappt nur, weil dein Ausdruck greedy ist und bis zum letzten vorkommen von ".*" den String durchsucht.
Ich würde versuchen, den Ausdruck spezifischer zu machen für das was du suchst.
Quelle: ItemspezifischeWerte"12",12,"aufwb_12.bmp","antwb_12.bmp"),
also die zu löschenden Dateien und den Pfad==>PROBLEM, einige Dateien haben folgenden Zeilenaufbau
Quelle : ItemspezifischeWerte("1",1,"auftr_01.bmp"," 63"),
D.h. du suchst nicht den 4. Parameter, sondern den dritten?
vielleicht so:
my $zeile = 'ItemspezifischeWerte("1",1,"auftr_01.bmp"," 63")';
zeile =~ s/"//g;
zeile =~ /((.*))/;
my @p = split ',', $1;
print $p[2];
Struppi.
D.h. du suchst nicht den 4. Parameter, sondern den dritten?
vielleicht so:
my $zeile = 'ItemspezifischeWerte("1",1,"auftr_01.bmp"," 63")';zeile =~ s/"//g;
zeile =~ /((.*))/;
my @p = split ',', $1;
print $p[2];Struppi.
Hi ihr 2, jein, die Parameter können an unterschiedlichen Stellen stehen.
Hier mal ein paar Zeilen aus Anderen logfiles.
Bsp 1:SetBild(AlleBild,"tip_a2.bmp")
Bsp 2:ItemspezifischeWerte("1",1,"aufrr_01.bmp"," 3/4"," 3/4",0,0,0,0,0,0,0,0),
Bsp 3:ItemspezifischeWerte("20",20,"aufgr_20.bmp"," 98"),
Bsp 4:ItemspezifischeWerte("10",10,"aufnf_10.bmp","antnf_10.bmp"),
Bei Zeilen in der logfile wie 1 z.B. brauche ich den letzten in "" geschriebenen Parameter
Bei 2 steht die .bmp Datei in der Mitte
Bei 3 vorletzter "" Parameter
Bei 4 ist es egal, allerdings darf nur 1x mal die .bmp Datei (oder .wav) herausgefiltert werden.
Zusammenfassung: Ich brauche einen regulären Ausdruck, der mir .wav .WAV. bmp und .BMP Dateien zwischen "*" geschrieben auspuckt. jedoch maximal 1x pro Zeile (siehe Bsp 4)
Add: Es gibt auch Zeilen die so ausschauen :
ItemspezifischeWerte("7",7,"aufrr_07.bmp"," 0,25"," 0,250"," ,25"," ,250",1," 0,2500"," 0,25000"," ,25000"," ,2500"," ,250000"),