$ #' --- $ #' 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 0 A 7 B 9 F Z Y D $ egrep "[[:xdigit:]]" input_a1.txt 0 A 7 B 9 F D $ $ #' ------------------------ $ #' ------------------------ $ $ # Aufgabe 2: RE fuer eine dreistellige Ganzzahl $ cat input_a2.txt 197 2022 55 44.3 44,3 hallo 2 999 1000 $ ## 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 197 999 $ $ #' ------------------------ $ #' ------------------------ $ $ # Aufgabe 3: "RE fuer eine dreistellige Ganzzahl mit (Pflicht-)Vorzeichen". $ cat input_a3.txt 700 -hallo -311 +12 +1000 +128 $ egrep "^(\+|-)[[:digit:]]{3,3}$" input_a3.txt -311 +128 $ $ #' ------------------------ $ #' ------------------------ $ $ $ # 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" (^[[:digit:]]{1,1},[[:digit:]]{2,2}[[:space:]](Euro|?)$)|(^[[:digit:]]{1,1}[[:space:]](Euro|?)$)|(^[[:digit:]]{1,3}[[:space:]](Cent|ct|c|¢)$) $ $ ## Input anzeigen $ cat input_a4.txt 3,35 Euro 7 Euro 22,66 Euro 5,00 Dollar 0,10 ? 555 ? 10 Cent 99 ct $ $ ## Gesamtausdruck auf Input anwenden $ egrep $gesamt input_a4.txt 3,35 Euro 7 Euro 0,10 ? 10 Cent 99 ct $ $ #' ------------------------ $ #' ------------------------ $ $ # 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" (^(31|30|[012][[:digit:]])(\.)(01)$)|(^(01)(/)(31|30|[012][[:digit:]])$) $ $ # Input anzeigen $ cat input_a5.txt 31.12 31.01 05.01 06.01 40.01 01/12 01/33 04/08 01/30 $ $ # Gesamtausdruck auf Input anwenden $ egrep $gesamt input_a5.txt 31.01 05.01 06.01 01/12 01/30 $ $ #' ------------------------ $ #' ------------------------ $ $ # Aufgabe 6) "RE fuer die 28 Tage des Februars (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" (^(28|27|26|25|24|23|22|21|20|[01][[:digit:]])(\.)(02)$)|(^(02)(/)(28|27|26|25|24|23|22|21|20|[01][[:digit:]])$) $ $ # Input anzeigen $ cat input_a6.txt 01.02 28.02 30.02 28.07 02/09 29/02 02/11 $ $ # Gesamtausdruck auf Input anwenden $ egrep $gesamt input_a6.txt 01.02 28.02 02/09 02/11 $ $ #' ------------------------ $ #' ------------------------ $ $ # Aufgabe 7) RE fuer ein beliebiges Zeichen, das kein Buchstabe is $ cat input_a7.txt 7 45 A ( H X ? Z - + 0 1 $ egrep "^[^[:alpha:]]$" input_a7.txt 7 ( ? - + 0 1 $ $ #' ------------------------ $ #' ------------------------ $ $ $ # Aufgabe 8) RE für eine beliebige Ziffer (Drei verschiedene Varianten) $ cat input_a7.txt 7 45 A ( H X ? Z - + 0 1 $ egrep "^[[:digit:]]$" input_a7.txt 7 0 1 $ egrep "^[0123456789]$" input_a7.txt 7 0 1 $ egrep "^[0-9]$" input_a7.txt 7 0 1 $ $ #' ------------------------ $ #' ------------------------ $ $ # Aufgabe 9) "RE fuer ein Zeichen, das kein Circumflex (^) ist." $ cat input_a9.txt a ^ ? Mehrere_Zeichen B $ egrep "^[^^]$" input_a9.txt a ? B $ $ #' ------------------------ $ #' ------------------------ $ $ $ # 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 - + a 9 [ ] / $ egrep "^(-|\[|\])$" input_a11.txt - [ ] $ $ #' ------------------------ $ #' ------------------------ $ $ $ # Aufgabe 12) "RE die alles ausser einer schliessenden eckigen Klammer oder einem Circumflex matcht". $ cat input_a12.txt ] [ ^ a 7 $ egrep "^[^]]" input_a12.txt [ ^ a 7 $ $ # Aufgabe 13) "Schreibe zwei verschiedene REs, die beide einen Backslash matchen". $ # Input anzeigen $ cat input_a13.txt \ / A z 9 $ ## 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 hallo du da $ egrep "$(printf '[\t]')" input_aufgabe15.txt hallo du da $ $ #' ------------------------ $ #' ------------------------ $ #' $ $ # 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 Maier Meier Mayer Meier Myer Müller Maiar $ egrep "(^M[ae][iy]er$)|(^Myer$)" input_a16.txt Maier Meier Mayer Meier Myer $ $ #' ------------------------ $ #' ------------------------ $ #' [ENDE] $