Belohnung [was: Re: multiline regex]
Geizhals » Forum » Linux-Support » multiline regex (10 Beiträge, 897 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
.  Re: multiline regex  (killerbees19 am 29.10.2020, 08:09:37)
.  Re: multiline regex  (at_emp am 29.10.2020, 13:42:35)
. PLONKED von Mr. 5  (carllance am 22.09.2021, 05:38:02)
.  Re: multiline regex  (traut am 24.09.2021, 10:55:44)
. PLONKED von Mr. 5  (freetoom4 am 15.10.2021, 09:18:18)
.
Belohnung [was: Re: multiline regex]
08.04.2023, 17:07:05
Nachdem der Railjet Richtung Linz gerade WLAN bietet, ueber das gefuehlt nicht mehr als 14.4kbps gehen, hab ich mich damit ein bisschen beschaeftigt ;)

Angenommen, du hast diese Datei tagebuch.txt:


Mi 20.10.1985

Hallo Welt

Das ist mein erster Eintrag.



Di 30.10.1995

Irgendwann dazwischen

Hier haben wir noch einiges vor uns. Wir versuchen einmal, vor dem Ende auch noch was weiterzubringen.
Wenn das klappt, sind wir froh, denn awk hat uns gerettet. So kann es gehen!

Aber wenn es nicht geht, ist es auch schoen warm.


Blah Blah. Letzte Zeile des mittleren Eintrags. Danach mehr als drei Leerzeilen.








Di 30.11.2025

Ende der Welt

Das ist mein letzter Eintrag.


Und diese Datei <tagebuchparser.awk:


#!/usr/bin/awk -f


BEGIN {
 ARGV[0]=""
  for (k in ARGV) {
    begriff=ARGV[k]
    ARGV[k]=""
    if(begriff != "") {
      suchbegriffe[begriff]=1
      funde_benoetigt++
    }
  }
}

/^$/ {
  leerzeilen++
  if(leerzeilen == 3) {
    tagebuch[eintrag_index] = eintrag_text
    eintrag_text = ""
  }
}

# Beginn eines Eintrags
/(Mo|Di|Mi|Do|Fr|Sa|So) [0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9][0-9]/ {
  leerzeilen=0
  eintrag_index=$2
}

# Alles andere an Text
/.+/ {
  leerzeilen=0
  eintrag_text = eintrag_text "\n" $0
}

END {
  tagebuch[eintrag_index] = eintrag_text
  for (idx in tagebuch) {
    seiten_insg++
    funde_pro_eintrag=0
    for (bgr in suchbegriffe) {
      if(tagebuch[idx] ~ bgr) {
        funde_pro_eintrag++
      }
    }
    if(funde_pro_eintrag == funde_benoetigt) {
      gefundene_seiten++
      print "-[START]----[" idx "]-"
      print tagebuch[idx]
      print "-[ENDE]----------------"
      print ""
    }
  }
  printf("Suche beendet. %d von %d Seiten (~%.0f%%) waren Treffer.\n",
         gefundene_seiten, seiten_insg, (100 * gefundene_seiten / seiten_insg))
}


... dann solltest du mit Aufrufen der Art:


./tagebuchparser.awk < tagebuch.txt Welt Ende

./tagebuchparser.awk < tagebuch.txt mein erster Eintrag


... ungefaehr das kriegen, was du haben wolltest. Oder? :)
 --

echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

So long, and thanks for all the uptime!


Antworten PM Alle Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung