#!/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 "?h1>" 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
#' ------------------------
#' ------------------------