#!/bin/sh #' --- #' title: "Lösungsversuch zum RegEXP-Kurs im Debianforum" #' author: "tegula" #' date: " 10 05 2022" #' output: html_document #' --- #' ------------------------ #' ------------------------ #' **Kurs-Teil:** 05 - Zeichenklassen #' **URL:** https://debianforum.de/forum/viewtopic.php?p=1301642#p1301642 #' ------------------------ #' ------------------------ # Aufgabe 1: "Re für eine Hexadezimalziffer"" cat input_a1.txt egrep "[[:xdigit:]]" input_a1.txt #' ------------------------ #' ------------------------ # Aufgabe 2: RE fuer eine dreistellige Ganzzahl cat input_a2.txt ## Muster (für eine dreistellige Zahl muss folgendes sein: Anfang der Zeichenkette "^", dreimal hintereinander Dezimalziffer ("[[:digit:]]{3,3}, Ende der Zeichenkette ("$") egrep "^[[:digit:]]{3,3}$" input_a2.txt #' ------------------------ #' ------------------------ # Aufgabe 3: "RE fuer eine dreistellige Ganzzahl mit (Pflicht-)Vorzeichen". cat input_a3.txt egrep "^(\+|-)[[:digit:]]{3,3}$" input_a3.txt #' ------------------------ #' ------------------------ # Aufgabe 4: "RE fuer einen Euro-und-Cent-Betrag kleiner 10,- [Euro]" ## Unterausdrücke definieren und als Shell-Variablen abspeichern euro_und_cent="^[[:digit:]]{1,1},[[:digit:]]{2,2}[[:space:]](Euro|?)$" # 0,00 Euro bis 10,00 Euro nur_euro="^[[:digit:]]{1,1}[[:space:]](Euro|?)$" # 0 Euro bis 10 Euro nur_cent="^[[:digit:]]{1,3}[[:space:]](Cent|ct|c|¢)$" # 0 Cent bis 1000 Cent ## Gesamtausdruck aus den Unterausdrücken zusammenfügen und als Shell-Variablen abspeichern gesamt="(${euro_und_cent})|(${nur_euro})|(${nur_cent})" printf "${gesamt}\n" ## Input anzeigen cat input_a4.txt ## Gesamtausdruck auf Input anwenden egrep $gesamt input_a4.txt #' ------------------------ #' ------------------------ # Aufgabe 5) "RE fuer die 31 Tage des Januars (zweistelliges Format mit fuehrender Null). Zwei Varianten". # Unterausdrucke definieren tag_zuerst="^(31|30|[012][[:digit:]])(\.)(01)$" monat_zuerst="^(01)(/)(31|30|[012][[:digit:]])$" # Gesamtausdruck zusammenfügen gesamt="(${tag_zuerst})|(${monat_zuerst})" printf "${gesamt}\n" # Input anzeigen cat input_a5.txt # Gesamtausdruck auf Input anwenden egrep $gesamt input_a5.txt #' ------------------------ #' ------------------------ # Aufgabe 6) "6) RE fuer die 28 Tage des Februars (zweistelliges Format mit fuehrender Null). Zwei Varianten." #' ------------------------ #' ------------------------ # Aufgabe 5) "RE fuer die 31 Tage des Januars (zweistelliges Format mit fuehrender Null). Zwei Varianten". #' ------------------------ #' ------------------------ # Unterausdrucke definieren tag_zuerst="^(28|27|26|25|24|23|22|21|20|[01][[:digit:]])(\.)(02)$" monat_zuerst="^(02)(/)(28|27|26|25|24|23|22|21|20|[01][[:digit:]])$" # Gesamtausdruck zusammenfügen gesamt="(${tag_zuerst})|(${monat_zuerst})" printf "${gesamt}\n" # Input anzeigen cat input_a6.txt # Gesamtausdruck auf Input anwenden egrep $gesamt input_a6.txt #' ------------------------ #' ------------------------ # Aufgabe 7) RE fuer ein beliebiges Zeichen, das kein Buchstabe is cat input_a7.txt egrep "^[^[:alpha:]]$" input_a7.txt #' ------------------------ #' ------------------------ # Aufgabe 8) RE für eine beliebige Ziffer (Drei verschiedene Varianten) cat input_a7.txt egrep "^[[:digit:]]$" input_a7.txt egrep "^[0123456789]$" input_a7.txt egrep "^[0-9]$" input_a7.txt #' ------------------------ #' ------------------------ # Aufgabe 9) "RE fuer ein Zeichen, das kein Circumflex (^) ist." cat input_a9.txt egrep "^[^^]$" input_a9.txt #' ------------------------ #' ------------------------ # Aufgabe 10) "RE fuer eine Zeichenklasse, die nur einen Circumflex matcht."" egrep "^[\^]$" input_a9.txt #' ------------------------ #' ------------------------ # Aufgabe 11) RE fuer ein Minus oder eine eckige Klammer. cat input_a11.txt egrep "^(-|\[|\])$" input_a11.txt #' ------------------------ #' ------------------------ # Aufgabe 12) "RE die alles ausser einer schliessenden eckigen Klammer oder einem Circumflex matcht". cat input_a12.txt egrep "^[^]]" input_a12.txt # Aufgabe 13) "Schreibe zwei verschiedene REs, die beide einen Backslash matchen". # Input anzeigen cat input_a13.txt ## Variante 1 egrep '\\' input_a13.txt # Auf Shell sind hier anscheinend zwingend einfache (statt dopelte) Anführungszeichen notwendig (??) ## Variante 2 egrep "[\]" input_a13.txt # Auf Shell sind hier anscheinend zwingend einfach Anführungszeichen notwendig #' ------------------------ #' ------------------------ # Aufgabe 14) "Was matcht die Zeichenklasse `[A-z]' ausser Buchstaben sonst noch? (Zeichensatz: US-ASCII)" #' --> Konnte diese Aufgabe nicht lösen. #' ------------------------ #' ------------------------ # Aufgabe 15) "RE, die einen Tab matcht. Versuche mehrere Varianten zu finden." ## Inputdatei erstellen printf "hallo du da\nhallo\tdu\tda" > input_aufgabe15.txt ## RE auf Inputdatei anwenden ### Anmerkung: Das Vorgehen (Umweg über printf), um Tabulator eingeben zu können, habe ich folgender URL entnommen: https://askubuntu.com/a/53096 egrep "$(printf '\t')" input_aufgabe15.txt egrep "$(printf '[\t]')" input_aufgabe15.txt #' ------------------------ #' ------------------------ #' # Aufgabe 16) "Schreibe einen egrep-Ausdruck (nun auch mit Zeichenklassen), um die Schreibweisen Maier, Meier, Mayer, Meier und Myer zu matchen." cat input_a16.txt egrep "(^M[ae][iy]er$)|(^Myer$)" input_a16.txt #' ------------------------ #' ------------------------ #' [ENDE]