|Ausgabe_RegExp_Kurs_06
von tegula- SNIPPET_TEXT:
-
- $ #' ---
- $ #' title: "Lösungsversuch zum RegEXP-Kurs im Debianforum"
- $ #' author: "tegula"
- $ #' date: "22 05 2022"
- $ #' output: html_document
- $ #' ---
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ #' **Kurs-Teil:** 06 - Punkt, Quantoren.
- $ #' **URL:** https://debianforum.de/forum/viewtopic.php?t=184230
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 1: "Matche mit einer RE allen Input".
- $ egrep --line-number "." schwaebische-kunde.txt
- 1:Schwaebische Kunde.
- 3:Als Kaiser Rothbart lobesam
- 4:Zum heil'gen Land gezogen kam,
- 5:Da musst' er mit dem frommen Heer
- 6:Durch ein Gebirge, wuest und leer.
- 7:Daselbst erhub sich grosse Noth,
- 8:Viel Steine gab's und wenig Brot,
- 9:Und mancher deutsche Reitersmann
- 10:Hat dort den Trunk sich abgethan.
- 11:Den Pferden war's so schwach im Magen,
- 12:Fast musst' der Reiter die Maehre tragen.
- 13:Nun war ein Herr aus Schwabenland,
- 14:Von hohem Wuchs und starker Hand,
- 15:Dess Roesslein war so krank und schwach,
- 16:Er zog es nur am Zaume nach,
- 17:Er haett' es nimmer aufgegeben
- 18:Und kostet's ihn das eigne Leben.
- 19:So blieb er bald ein gutes Stueck
- 20:Hinter dem Heereszug zurueck,
- 21:Da sprengten ploetzlich in die Queer
- 22:Fuenfzig tuerkische Reiter daher,
- 23:Die huben an, auf ihn zu schiessen,
- 24:Nach ihm zu werfen mit den Spiessen.
- 25:Der wackre Schwabe forcht' sich nit,
- 26:Ging seines Weges Schritt vor Schritt,
- 27:Liess sich den Schild mit Pfeilen spicken
- 28:Und thaet nur spoettlich um sich blicken,
- 29:Bis Einer, dem die Zeit zu lang,
- 30:Auf ihn den krummen Saebel schwang.
- 31:Da wallt dem Deutschen auch sein Blut,
- 32:Er trifft des Tuerken Pferd so gut,
- 33:Er haut ihm ab mit Einem Streich
- 34:Die beiden Vorderfuess' zugleich.
- 35:Als er das Thier zu Fall gebracht,
- 36:Da fasst er erst sein Schwerdt mit Macht,
- 37:Er schwingt es auf des Reiters Kopf,
- 38:Haut durch bis auf den Sattelknopf,
- 39:Haut auch den Sattel noch zu Stuecken
- 40:Und tief noch in des Pferdes Ruecken;
- 41:Zur Rechten sieht man, wie zur Linken,
- 42:Einen halben Tuerken heruntersinken.
- 43:Da packt die Andern kalter Graus,
- 44:Sie fliehen in alle Welt hinaus,
- 45:Und Jedem ist's, als wuerd' ihm mitten
- 46:Durch Kopf und Leib hindurchgeschnitten.
- 47:Drauf kam des Wegs 'ne Christenschaar,
- 48:Die auch zurueck geblieben war,
- 49:Die sahen nun mit gutem Bedacht
- 50:Was Arbeit unser Held gemacht.
- 51:Von denen hat's der Kaiser vernommen,
- 52:Der liess den Schwaben vor sich kommen,
- 53:Er sprach: "Sagt an, mein Ritter werth!
- 54:Wer hat Euch solche Streich' gelehrt?"
- 55:Der Held bedacht' sich nicht zu lang:
- 56:"Die Streiche sind bei uns im Schwang,
- 57:Sie sind bekannt im ganzen Reiche,
- 58:Man nennt sie halt nur Schwabenstreiche."
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 2: "Extrahiere mit `egrep -o' alle Zahlen aus einem Text".
- $ ## Eingabetext anzeigen
- $ cat -n a2.txt
- 1 [Deutscher Dezimaltrenner (Komma)]
- 2 Hans hat beim Bäcker 2 Brote und 10 Brötchen und 4 Crossaints.
- 3 Hans' Rechnung beim Bäcker betrug 15,99 Euro.
- 4 Hans hat mit einem 20-Euro-Schein bezahlt. Das Rückgeld betrug somit 4,01 Euro.
- 5
- 6 [Englischer Dezimaltrenner (Punkt)]
- 7 Hans has 2 loaves of bread and 10 rolls and 4 croissants at the bakery.
- 8 Hans' bill at the bakery was 15.99 euros.
- 9 Hans paid with a 20 euro note. The change amounted to 4.01 euros.
- $ ## Zahlen mit 'egrep -o' extrahieren (sowohl Komma und Punkt als Dezimal- und/oder Tausender-Trenner erlaubt)
- $ egrep -o "[[:digit:]]+[.,]*[[:digit:]]*" a2.txt
- 2
- 10
- 4
- 15,99
- 20
- 4,01
- 2
- 10
- 4
- 15.99
- 20
- 4.01
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 3: "Matche in einem XML-Input mit einer RE (ohne Alternation) die Beginn- und Ende-Tags `<h1>' und `</h1>'".
- $
- $ ## Input herunterladen
- $ wget -O "Forum_RegEx-Kurs_Teil_06.html" https://debianforum.de/forum/viewtopic.php?p=1302386
- --2022-05-24 13:53:46-- https://debianforum.de/forum/viewtopic.php?p=1302386
- Auflösen des Hostnamens debianforum.de (debianforum.de)… 142.132.203.155, 2a01:4f8:261:4fe1::2
- Verbindungsaufbau zu debianforum.de (debianforum.de)|142.132.203.155|:443 … verbunden.
- HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
- Länge: nicht spezifiziert [text/html]
- Wird in »Forum_RegEx-Kurs_Teil_06.html« gespeichert.
- Forum_RegEx-Kurs_Teil_06.html [ <=> ] 60,12K --.-KB/s in 0,05s
- 2022-05-24 13:53:47 (1,27 MB/s) - »Forum_RegEx-Kurs_Teil_06.html« gespeichert [61568]
- $
- $ ## Nur Tags, ohne eingeschlossenen Text)
- $ egrep -o --line-number "</?h1>" Forum_RegEx-Kurs_Teil_06.html
- 55:<h1>
- 55:</h1>
- $
- $ ## Ausgabe: Tags, einschließlich dem eingeschlossenen Text
- $ egrep -o --line-number "(<h1>)+(.)*(</h1>)+" Forum_RegEx-Kurs_Teil_06.html
- 55:<h1>debianforum.de</h1>
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 4) "Schreibe die entsprechenden Intervallausdruecke fuer die drei anderen Quantoren: * + ?"
- $ ## Eingabe anzeigen
- $ cat -n a4.txt
- 1 Xa
- 2 X96
- 3 Zb
- 4 Zaa
- 5 Yaaaaaaaaaa
- $
- $ ## "*" (beliebige Zahl an Wiederholungen, auch 0 Wiederholungen möglich)
- $ egrep -o --line-number "(.)a{,}" a4.txt
- 1:Xa
- 2:X
- 2:9
- 2:6
- 3:Z
- 3:b
- 4:Zaa
- 5:Yaaaaaaaaaa
- $ egrep -o --line-number "(.)a*" a4.txt # Kontrolle mit Sternchen-Operator
- 1:Xa
- 2:X
- 2:9
- 2:6
- 3:Z
- 3:b
- 4:Zaa
- 5:Yaaaaaaaaaa
- $
- $ ## "+" (mindestens eine Wiederholung)
- $ egrep -o ".(a{1,})" a4.txt
- Xa
- Zaa
- Yaaaaaaaaaa
- $ egrep -o --line-number "(.)a+" a4.txt # Kontrolle mit plus-Operator
- 1:Xa
- 4:Zaa
- 5:Yaaaaaaaaaa
- $
- $ ## "?" (vorheriges Zeichen darf einmalig vorkommen, muss aber nicht vorkommen)
- $ egrep -o --line-number "(.)a{0,1}" a4.txt
- 1:Xa
- 2:X
- 2:9
- 2:6
- 3:Z
- 3:b
- 4:Za
- 4:a
- 5:Ya
- 5:aa
- 5:aa
- 5:aa
- 5:aa
- 5:a
- $ egrep -o --line-number "(.)a?" a4.txt # Kontrolle mit Fragezeichen-Operator
- 1:Xa
- 2:X
- 2:9
- 2:6
- 3:Z
- 3:b
- 4:Za
- 4:a
- 5:Ya
- 5:aa
- 5:aa
- 5:aa
- 5:aa
- 5:a
- $
- $ #' ------------------------
- $ #' ------------------------
- $ # Aufgabe 5) "Erklaere die RE: `**'. Auf was wird sie matchen"?
- $
- $ ## eigentlicher Ausdruck aus Aufgabe
- $ egrep --line-number "**" schwaebische-kunde.txt
- 1:Schwaebische Kunde.
- 2:
- 3:Als Kaiser Rothbart lobesam
- 4:Zum heil'gen Land gezogen kam,
- 5:Da musst' er mit dem frommen Heer
- 6:Durch ein Gebirge, wuest und leer.
- 7:Daselbst erhub sich grosse Noth,
- 8:Viel Steine gab's und wenig Brot,
- 9:Und mancher deutsche Reitersmann
- 10:Hat dort den Trunk sich abgethan.
- 11:Den Pferden war's so schwach im Magen,
- 12:Fast musst' der Reiter die Maehre tragen.
- 13:Nun war ein Herr aus Schwabenland,
- 14:Von hohem Wuchs und starker Hand,
- 15:Dess Roesslein war so krank und schwach,
- 16:Er zog es nur am Zaume nach,
- 17:Er haett' es nimmer aufgegeben
- 18:Und kostet's ihn das eigne Leben.
- 19:So blieb er bald ein gutes Stueck
- 20:Hinter dem Heereszug zurueck,
- 21:Da sprengten ploetzlich in die Queer
- 22:Fuenfzig tuerkische Reiter daher,
- 23:Die huben an, auf ihn zu schiessen,
- 24:Nach ihm zu werfen mit den Spiessen.
- 25:Der wackre Schwabe forcht' sich nit,
- 26:Ging seines Weges Schritt vor Schritt,
- 27:Liess sich den Schild mit Pfeilen spicken
- 28:Und thaet nur spoettlich um sich blicken,
- 29:Bis Einer, dem die Zeit zu lang,
- 30:Auf ihn den krummen Saebel schwang.
- 31:Da wallt dem Deutschen auch sein Blut,
- 32:Er trifft des Tuerken Pferd so gut,
- 33:Er haut ihm ab mit Einem Streich
- 34:Die beiden Vorderfuess' zugleich.
- 35:Als er das Thier zu Fall gebracht,
- 36:Da fasst er erst sein Schwerdt mit Macht,
- 37:Er schwingt es auf des Reiters Kopf,
- 38:Haut durch bis auf den Sattelknopf,
- 39:Haut auch den Sattel noch zu Stuecken
- 40:Und tief noch in des Pferdes Ruecken;
- 41:Zur Rechten sieht man, wie zur Linken,
- 42:Einen halben Tuerken heruntersinken.
- 43:Da packt die Andern kalter Graus,
- 44:Sie fliehen in alle Welt hinaus,
- 45:Und Jedem ist's, als wuerd' ihm mitten
- 46:Durch Kopf und Leib hindurchgeschnitten.
- 47:Drauf kam des Wegs 'ne Christenschaar,
- 48:Die auch zurueck geblieben war,
- 49:Die sahen nun mit gutem Bedacht
- 50:Was Arbeit unser Held gemacht.
- 51:Von denen hat's der Kaiser vernommen,
- 52:Der liess den Schwaben vor sich kommen,
- 53:Er sprach: "Sagt an, mein Ritter werth!
- 54:Wer hat Euch solche Streich' gelehrt?"
- 55:Der Held bedacht' sich nicht zu lang:
- 56:"Die Streiche sind bei uns im Schwang,
- 57:Sie sind bekannt im ganzen Reiche,
- 58:Man nennt sie halt nur Schwabenstreiche."
- $
- $ ## zusätzliche Klammern ergänzen, um das Lesen des Ausdrucks zu vereinfach ()
- $ egrep --line-number "()*()*" schwaebische-kunde.txt
- 1:Schwaebische Kunde.
- 2:
- 3:Als Kaiser Rothbart lobesam
- 4:Zum heil'gen Land gezogen kam,
- 5:Da musst' er mit dem frommen Heer
- 6:Durch ein Gebirge, wuest und leer.
- 7:Daselbst erhub sich grosse Noth,
- 8:Viel Steine gab's und wenig Brot,
- 9:Und mancher deutsche Reitersmann
- 10:Hat dort den Trunk sich abgethan.
- 11:Den Pferden war's so schwach im Magen,
- 12:Fast musst' der Reiter die Maehre tragen.
- 13:Nun war ein Herr aus Schwabenland,
- 14:Von hohem Wuchs und starker Hand,
- 15:Dess Roesslein war so krank und schwach,
- 16:Er zog es nur am Zaume nach,
- 17:Er haett' es nimmer aufgegeben
- 18:Und kostet's ihn das eigne Leben.
- 19:So blieb er bald ein gutes Stueck
- 20:Hinter dem Heereszug zurueck,
- 21:Da sprengten ploetzlich in die Queer
- 22:Fuenfzig tuerkische Reiter daher,
- 23:Die huben an, auf ihn zu schiessen,
- 24:Nach ihm zu werfen mit den Spiessen.
- 25:Der wackre Schwabe forcht' sich nit,
- 26:Ging seines Weges Schritt vor Schritt,
- 27:Liess sich den Schild mit Pfeilen spicken
- 28:Und thaet nur spoettlich um sich blicken,
- 29:Bis Einer, dem die Zeit zu lang,
- 30:Auf ihn den krummen Saebel schwang.
- 31:Da wallt dem Deutschen auch sein Blut,
- 32:Er trifft des Tuerken Pferd so gut,
- 33:Er haut ihm ab mit Einem Streich
- 34:Die beiden Vorderfuess' zugleich.
- 35:Als er das Thier zu Fall gebracht,
- 36:Da fasst er erst sein Schwerdt mit Macht,
- 37:Er schwingt es auf des Reiters Kopf,
- 38:Haut durch bis auf den Sattelknopf,
- 39:Haut auch den Sattel noch zu Stuecken
- 40:Und tief noch in des Pferdes Ruecken;
- 41:Zur Rechten sieht man, wie zur Linken,
- 42:Einen halben Tuerken heruntersinken.
- 43:Da packt die Andern kalter Graus,
- 44:Sie fliehen in alle Welt hinaus,
- 45:Und Jedem ist's, als wuerd' ihm mitten
- 46:Durch Kopf und Leib hindurchgeschnitten.
- 47:Drauf kam des Wegs 'ne Christenschaar,
- 48:Die auch zurueck geblieben war,
- 49:Die sahen nun mit gutem Bedacht
- 50:Was Arbeit unser Held gemacht.
- 51:Von denen hat's der Kaiser vernommen,
- 52:Der liess den Schwaben vor sich kommen,
- 53:Er sprach: "Sagt an, mein Ritter werth!
- 54:Wer hat Euch solche Streich' gelehrt?"
- 55:Der Held bedacht' sich nicht zu lang:
- 56:"Die Streiche sind bei uns im Schwang,
- 57:Sie sind bekannt im ganzen Reiche,
- 58:Man nennt sie halt nur Schwabenstreiche."
- $
- $ #' **Antwort:** Sie wird auf jedes Zeichenfolge (das heißt in diesem Fall: Auf jede Zeile der Datei) matchen, da die Aussage "Die Zeilenfolge besteht aus mindestens 0 Wiederholungen und maximal unendlich vielen Wiederholungen von 'keinem Zeichen' (), gefolgt von (erneut) mindestens 0 Wiederholungen und maximal unendlich vielen Wiederholungen von 'keinem Zeichen' ()" scheinbar (?) für jede Zeichenfolge gilt.
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 6) "``Bananen?'' -- Dies ist keine Frage, sondern?"
- $ cat -n a6.txt
- 1 Annanas
- 2 Banan
- 3 Banane
- 4 Bananen
- 5 Bananenn
- 6 Bananem
- $ egrep -o --line-number "Bananen?" a6.txt
- 3:Banane
- 4:Bananen
- 5:Bananen
- 6:Banane
- $
- $ #' **Antwort:** ... ein RE, der sowohl auf "Banane" als auch auf "Bananen" matcht
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 7) "Matche alles bis ``ENDE'' (inklusive)".
- $ ## Eingabetext anzeigen
- $ cat -n a7.txt
- 1 Das ist eine Geschichte.
- 2 Sie ist leider nicht sehr lang.
- 3 Sie ist schon jetzt zu ENDE. Ganz zu ENDE.
- 4 Ja das ist wirklich schon das Ende bzw. ENDE. Ja genau: Das ENDE :(
- $ ## bis zum _letzten_ 'ENDE' jeder Zeile
- $ egrep -o --line-number "(.)*(ENDE){1}" a7.txt
- 3:Sie ist schon jetzt zu ENDE. Ganz zu ENDE
- 4:Ja das ist wirklich schon das Ende bzw. ENDE. Ja genau: Das ENDE
- $ ## bis zum _letzten_ 'ENDE' in jener Zeile, in der das Wort 'ENDE' zum ersten mal auftritt
- $ egrep -o --max-count 1 --line-number "(.)*(ENDE){1}" a7.txt
- 3:Sie ist schon jetzt zu ENDE. Ganz zu ENDE
- $ ## bis zum _ersten_ 'ENDE' der jeder Zeile
- $ ### --> Habe hierfür leider keine Lösung herausgefinden können.
- $ ## bis zum _allerersten_ 'ENDE' des Textes
- $ ### --> Habe hierfür leider keine Lösung herausgefinden können.
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 8 "Matche den Inhalt eines Single-Quoted Strings (dieser kann das Single-Quote nicht enthalten)."
- $ ## Gesamter Zeichenkette (einschließlich des Single-Quoted-String) definiernen und in einer Datei abspeichern
- $ printf "Das Folgende ist ein 'Single-Quoted String'. Danach ist es wieder ein normaler String" > a8_input.txt
- $ printf "\n"
- $ ## Reguläre Ausdruck definieren und in eine Datei abspeichern
- $ printf "(')(.)*(')" > a8_regex.txt
- $ printf "\n"
- $ ## Abgespeicherten regulären Ausdruck auf abspeicherte Zeichenkette anwenden
- $ egrep -o -f a8_regex.txt a8_input.txt
- 'Single-Quoted String'
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 9 "Matche einen Satz, d.h. von einem Grossbuchstaben bis zum naechsten Satzendezeichen. (Zweimal drueber nachdenken und testen. Der erste Ansatz ist nicht unbedingt ausreichend!)".
- $
- $ ## Satz anzeigen
- $ cat a9.txt
- Das ist der erste Satz. Und was ist das? Ein weiterer Satz!
- $
- $ ## egrep ausführen bzw. RE anwenden
- $ ### **Anmerkung (1):** Einzelne Anführungszeichen sind hier scheinbar (?) notwendig, weil die Shell sonst eine Fehlermeldung ausgibt ("[...] event not found")
- $ egrep -o '[[:upper:]][^?.!:]*([?.!:])' a9.txt
- Das ist der erste Satz.
- Und was ist das?
- Ein weiterer Satz!
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 10: "Matche grosse Geldwerte mit Tausendertrenner."
- $ ## Eingabe anzeigen
- $ cat a10.txt
- 100000
- 100000 Euro
- 10.000 Euro
- 70.000 €
- 537,28 Euro
- 890.785,71€
- 7.55 Euro
- $ ## egrep ausführen bzw. RE anwenden
- $ egrep -o --line-number "([[:digit:]]|,)*([.][[:digit:]]{3,3})(,[[:digit:]]{2})?([[:blank:]])?(Euro|€)*" a10.txt
- 3:10.000 Euro
- 4:70.000 €
- 6:890.785,71€
- $
- $ #' ------------------------
- $ #' ------------------------
- $
- $ # Aufgabe 11: "Finde ein sinnhaftes Praxisbeispiel fuer eine RE mit Punkt aber ohne Quantoren."
- $
- $ #' **ANTWORT bzw. Beispiel;** Kontrollieren, ob eine gewählte Abkürzung eine eine Länge von von genau drei Zeichen einhält.
- $
- $ ## Eingabe anzeigen
- $ cat a11.txt
- g23
- abX
- AbHUi5g
- 125
- 14 h
- $
- $ # egrep ausführen bzw. RE anwenden
- $ egrep -o --line-number "^(...)$" a11.txt
- 1:g23
- 2:abX
- 4:125
- $
- $ #' ------------------------
- $ #' ------------------------
- $
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN