MatzeA: Zeilenumbrüche suchen und finden.

Servus,

heute setze Ich irgendwie auf der Leitung.
Ich habe mehrere Log Dateien, wo leider leider irgendwan mal nicht an \n gespart wurde.
Ich lade nun diese Datei in einen Skalar und wollte nicht nur bestimmte Worte ersetzen sodern auch manches überflüssiges \n rauschmeissen.

Natürlich nicht alle aber immer dann wenn zig hintereinander kommen.

Wie untersuche nun solchen string und finde Zeilenumbrüche?

mit $Scalar eq "\n" etc. komme ich nicht weiter.

Gruss Matze

  1. hi,

    Natürlich nicht alle aber immer dann wenn zig hintereinander kommen.

    Wie untersuche nun solchen string und finde Zeilenumbrüche?

    mit $Scalar eq "\n" etc. komme ich nicht weiter.

    mit /^\n$/; sollten diese Leerzeilen zu finden sein.

    Viele Grüße, Rolf

    --
    SELFforum - Das Tor zur Welt!
    Theoretiker: Wie kommt das Kupfer in die Leitung?
    Praktiker: Wie kommt der Strom in die Leitung?
    1. Hallo Rolf,

      mit /^\n$/; sollten diese Leerzeilen zu finden sein.

      Und mit $scalar =~ s/\n//g; könnte man sie rausschmeißen.

      Grüße
      Torsten

      1. hi Torsten,

        mit /^\n$/; sollten diese Leerzeilen zu finden sein.

        Und mit $scalar =~ s/\n//g; könnte man sie rausschmeißen.

        Vorsicht, da fliegen alle raus: ich hab extra die Anker gesetzt
        vorn ^
        hinten $

        Viele Grüße, Rolf

        --
        SELFforum - Das Tor zur Welt!
        Theoretiker: Wie kommt das Kupfer in die Leitung?
        Praktiker: Wie kommt der Strom in die Leitung?
        1. Hallo Rolf,

          Und mit $scalar =~ s/\n//g; könnte man sie rausschmeißen.
          Vorsicht, da fliegen alle raus: ich hab extra die Anker gesetzt

          Jo, aber wenn ich den OP richtig verstanden habe, ist der gesamte Inhalt seiner Textdatei in einem Skalar. Also wird er wohl weder mit meiner noch mit deiner Lösung zum gewünschten Ergebnis kommen :-) Aber ich gehe mal davon aus, dass er fähig genug ist, aus deiner und meiner Antwort ein vernünftiges Konzept für sein Problem zu entwickeln.

          Grüße
          Torsten

          PS: Heute ist Feiertag *hüpf*

          1. Servus,

            Und mit $scalar =~ s/\n//g; könnte man sie rausschmeißen.
            Vorsicht, da fliegen alle raus: ich hab extra die Anker gesetzt

            »»

            Öhm... ja doch das könnte passieren.

            Jo, aber wenn ich den OP richtig verstanden habe, ist der gesamte Inhalt seiner Textdatei in einem Skalar. Also wird er wohl weder mit meiner noch mit deiner Lösung zum gewünschten Ergebnis kommen :-) Aber ich gehe mal davon aus, dass er fähig genug ist, aus deiner und meiner Antwort ein vernünftiges Konzept für sein Problem zu entwickeln.

            Ne irgendwie ist die leitung völlig gequetscht :-)).
            Wir sprchen schon alle davon, dass ich mit \n nicht wirkich \n sondern Zeilenumbruch meine.

            Denn ähnliche ($scalar =~ s/\n//g; )obige Lösung habe ich schon verwendet und wollte damit alls Zeilenumbrüche durch nicht`s ersetzen. mmmmm das hat jar nicht geklappt.

            Und ja richtig, ich will, natürlich den ersten nd letzen Zeilenumbruch nicht rausschmeissen.

            Es geht nur im die

            {

            }
            Zeilenümbrüche, die aus Sicht der Formatierung unsinnig sind.

            Gruss Matze

            1. Hallo,

              Denn ähnliche ($scalar =~ s/\n//g; )obige Lösung habe ich schon verwendet und wollte damit alls Zeilenumbrüche durch nicht`s ersetzen. mmmmm das hat jar nicht geklappt.

              Dann lies doch die Datei zeilenweise aus und speichere die ausgelesene Zeile nur dann, wenn sie keine für dein Vorhaben unsinnige Leerzeile ist.

              Grüße
              Torsten

          2. hi Torsten,

            Und mit $scalar =~ s/\n//g; könnte man sie rausschmeißen.
            Vorsicht, da fliegen alle raus: ich hab extra die Anker gesetzt

            Jo, aber wenn ich den OP richtig verstanden habe, ist der gesamte Inhalt seiner Textdatei in einem Skalar. Also wird er wohl weder mit meiner noch mit deiner Lösung zum gewünschten Ergebnis kommen :-) Aber ich gehe mal davon aus, dass er fähig genug ist, aus deiner und meiner Antwort ein vernünftiges Konzept für sein Problem zu entwickeln.

            Jow, wir machen es anders:
            =scr
            use strict;

            my $s = qq(

            erwin

            rolf

            );

            wir splitten den string in ein array...

            my @ziles = split /\n/, $s;

            ... und schmeißen die Leerzeilen raus

            foreach my $zeile( @ziles ){
             print "$zeile\n" if $zeile gt "";
            }
            =cut

            PS: Heute ist Feiertag *hüpf*

            Bei uns morgen - ist aber blödsinn weil sowieso frei ;-)

            Viele Grüße, Rolf

            --
            SELFforum - Das Tor zur Welt!
            Theoretiker: Wie kommt das Kupfer in die Leitung?
            Praktiker: Wie kommt der Strom in die Leitung?
            1. Servus,

              Vielen Dank...
              ja das sollte klappen zwar nicht ganz aber damit kann ich was anfangen.
              Gruss Matze

            2. Hallo,

              wir splitten den string in ein array...

              my @ziles = split /\n/, $s;

              warum dann nicht
              $s = join("\n",split('\n+', $s))."\n";

              oder

              $s =~ s/\n+/\n/gm;

              Grüße
                Klaus

              1. Hallo Klaus,

                warum dann nicht
                $s = join("\n",split('\n+', $s))."\n";
                oder
                $s =~ s/\n+/\n/gm;

                Hm, warum nicht gleich beim Einlesen prüfen:
                open(DATEI, "test.log") || die $!;
                while(<DATEI>) {
                  unless($_ =~ /^\n$/) {
                    push(@zeilen, $_);
                  }
                }

                Den RegEx müsste man natürlich noch anpassen. Naja, ist nur so 'ne Idee...

                Grüße
                Torsten

  2. Hi,

    also so ganz hab ich noch nicht.

    Wie bekomme ich bei fogendem Skalar
    $s = qq~

    Fehler 123
    Fehler xy
    hachja Feher

    Fehler Fehler

    ~;

    wie frage ich nun z.B. danach ab, ob in dem String $s mehr als 2
    aneinander hängende "\n" Zeilenumbrüche habe?

    Ich habe das mit eq und allem mögliche versucht klappt nicht, nicht einmal, wenn theoretisch $s = "\n\n\n" sein müsste.

    Gruss Matze

    1. Hi,

      wie frage ich nun z.B. danach ab, ob in dem String $s mehr als 2
      aneinander hängende "\n" Zeilenumbrüche habe?

      $s=~s/\n{2,}//g;

      müsste alle Vorkommen von mindestens zwei \n's nacheinander rauslöschen. (ungetestet)

      HTH

      wunderwarzenschwein

      --
      ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
      1. Servus,

        danek aber Du hast meine Frage falsch verstanden.
        Das löschen war mir soweit klar.
        Jedoch wie packe ich es in eine If z.B:

        Wie frage ich nach den 2-3 Leerstellen.
        Wie sieht der Verlgeich aus..
        if ($s eq "\n\n\n")

        klappt ja nicht.

        Gruss matze

        1. Hi,

          danek aber Du hast meine Frage falsch verstanden.
          Das löschen war mir soweit klar.
          Jedoch wie packe ich es in eine If z.B:

          Wie frage ich nach den 2-3 Leerstellen.
          Wie sieht der Verlgeich aus..

          Du brauchst keinen Vergleich. Der s//-Operator sucht automatisch nach allen entsprechenden Vorkommen und löscht sie.

          mit folgendem Skript bekomme ich nun das (hoffentlich) gewünschte Ergebnis:

          $s = qq~

          Fehler 123
          Fehler xy
          hachja Feher

          Fehler Fehler

          ~;

          $s=~s/\n{2,}/\n/g;
          $s=~s/^\n//;
          $s=~s/\n$//;

          Das liefert mit dann in $s:

          Fehler 123
          Fehler xy
          hachja Feher
          Fehler Fehler

          Mit der ersten s//-Zeile werden alle Vorkommen von zwei oder mehr \n durch ein einzelnes \n ersetzt, die beiden anderen, entfernen \n's am Anfang bzw. Ende des Strings.

          HTH

          wunderwarzenschwein

          --
          ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
          1. Hi,

            :-))))))))

            Deine Gedult ist wirklich gut aber das will ich nun wirklich nicht mehr wissen.
            Das habe ich verstanden.

            Ich möchte jedoch an einer anderen Stelle ein Warning ausgeben, sollte
            zukünftig bei einer Untersucheung nochmals solche Umbrüche erscheinen, die keiner haben möchte.

            Ich weiss jedoch wirklich nicht, wie ich darauf in einer if Anweisung abfragen soll. Denn das was ich versuhte gin in die Hose.

            Wenn wieder jemand in seiner Anwendung falsch loggt, soll unter anderem das Script eine Mail an den betreffenden senden.

            Dafür muss ich jedoch erst mal feststellen, dass mehrere Umbrüche im Log stehen.

            Gruss Matze

            1. Hi,

              Ich möchte jedoch an einer anderen Stelle ein Warning ausgeben, sollte
              zukünftig bei einer Untersucheung nochmals solche Umbrüche erscheinen, die keiner haben möchte.

              Achso. Dann bin ich bei der Logik "Erst rauslöschen, und dann prüfen ob welche da sind" nicht ganz mitgekommen. ;-))

              Ich weiss jedoch wirklich nicht, wie ich darauf in einer if Anweisung abfragen soll. Denn das was ich versuhte gin in die Hose.

              Ganz einfach: Statt s// mit m//

              if ($s=~m/\n{2,}/){
                #Zwei oder mehr aufeinanderfolgende Umbrüche vorhanden
              }

              Wenn wieder jemand in seiner Anwendung falsch loggt, soll unter anderem das Script eine Mail an den betreffenden senden.

              *Das* bleibt dem interessierten Leser zur Übung überlassen... ;-)

              (Und wenn ich jetzt wieder nicht kapiert hab, um was es eigentlich geht, mach ich Feierabend!)

              wunderwarzenschwein

              --
              ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
              1. Servus,

                Ganz einfach: Statt s// mit m//

                if ($s=~m/\n{2,}/){
                  #Zwei oder mehr aufeinanderfolgende Umbrüche vorhanden
                }

                Aha prima genau das habe ich gesucht.
                Teufelszeug aber auch diese /// und sontwas verkettete anweisungen.

                Vielen dank genau das wollte ich wissen.

                Gruss Matze