RegExp-Kurs_06.sh
von tegula- SNIPPET_DESC:
- Bitte Dateinahmensendung ".txt" entfernen.
- SNIPPET_CREATION_TIME:
- 24.05.2022 14:03:43
- SNIPPET_PRUNE_TIME:
- Unendlich
- SNIPPET_TEXT:
-
- #!/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 `<h1>' und `</h1>'".
- ## 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 "(<h1>)+(.)*(</h1>)+" 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
- #' ------------------------
- #' ------------------------
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN