#!/bin/sh #' --- #' 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 #' ------------------------ #' ------------------------ # Aufgabe 2: "Extrahiere mit `egrep -o' alle Zahlen aus einem Text". ## Eingabetext anzeigen cat -n a2.txt ## Zahlen mit 'egrep -o' extrahieren (sowohl Komma und Punkt als Dezimal- und/oder Tausender-Trenner erlaubt) egrep -o "[[:digit:]]+[.,]*[[:digit:]]*" a2.txt #' ------------------------ #' ------------------------ # 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 ## Nur Tags, ohne eingeschlossenen Text) egrep -o --line-number "" Forum_RegEx-Kurs_Teil_06.html ## Ausgabe: Tags, einschließlich dem eingeschlossenen Text egrep -o --line-number "(

)+(.)*(

)+" Forum_RegEx-Kurs_Teil_06.html #' ------------------------ #' ------------------------ # Aufgabe 4) "Schreibe die entsprechenden Intervallausdruecke fuer die drei anderen Quantoren: * + ?" ## Eingabe anzeigen cat -n a4.txt ## "*" (beliebige Zahl an Wiederholungen, auch 0 Wiederholungen möglich) egrep -o --line-number "(.)a{,}" a4.txt egrep -o --line-number "(.)a*" a4.txt # Kontrolle mit Sternchen-Operator ## "+" (mindestens eine Wiederholung) egrep -o ".(a{1,})" a4.txt egrep -o --line-number "(.)a+" a4.txt # Kontrolle mit plus-Operator ## "?" (vorheriges Zeichen darf einmalig vorkommen, muss aber nicht vorkommen) egrep -o --line-number "(.)a{0,1}" a4.txt egrep -o --line-number "(.)a?" a4.txt # Kontrolle mit Fragezeichen-Operator #' ------------------------ #' ------------------------ # Aufgabe 5) "Erklaere die RE: `**'. Auf was wird sie matchen"? ## eigentlicher Ausdruck aus Aufgabe egrep --line-number "**" schwaebische-kunde.txt ## zusätzliche Klammern ergänzen, um das Lesen des Ausdrucks zu vereinfach () egrep --line-number "()*()*" schwaebische-kunde.txt #' **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 egrep -o --line-number "Bananen?" a6.txt #' **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 ## bis zum _letzten_ 'ENDE' jeder Zeile egrep -o --line-number "(.)*(ENDE){1}" a7.txt ## 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 ## 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 #' ------------------------ #' ------------------------ # 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 ## 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 #' ------------------------ #' ------------------------ # Aufgabe 10: "Matche grosse Geldwerte mit Tausendertrenner." ## Eingabe anzeigen cat a10.txt ## egrep ausführen bzw. RE anwenden egrep -o --line-number "([[:digit:]]|,)*([.][[:digit:]]{3,3})(,[[:digit:]]{2})?([[:blank:]])?(Euro|?)*" a10.txt #' ------------------------ #' ------------------------ # 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 # egrep ausführen bzw. RE anwenden egrep -o --line-number "^(...)$" a11.txt #' ------------------------ #' ------------------------