$ #' --- $ #' 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 `

' und `

'". $ $ ## 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 "" Forum_RegEx-Kurs_Teil_06.html 55:

55:

$ $ ## Ausgabe: Tags, einschließlich dem eingeschlossenen Text $ egrep -o --line-number "(

)+(.)*(

)+" Forum_RegEx-Kurs_Teil_06.html 55:

debianforum.de

$ $ #' ------------------------ $ #' ------------------------ $ $ # 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 $ $ #' ------------------------ $ #' ------------------------ $