Markus: open+Regular Expressions

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=~(/(.*)"(.*)"/)){

  1. Hi,

    ich hab das Problem jetzt nicht genau verstanden, aber suchst du evtl. sowas:

    if( $zeile =~ /(.*)"(.wav)"/ || $zeile =~ /(.*)"(.bmp)"/ ){
    ...
    }

    HTH, Stefan

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

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

    1. 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)

      1. 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"),