NoPaste

|Ausgabe_RegExp_Kurs_06

von tegula

SNIPPET_TEXT:
  1. $ #' ---
  2. $ #' title: "Lösungsversuch zum RegEXP-Kurs im Debianforum"
  3. $ #' author: "tegula"
  4. $ #' date: "22 05 2022"
  5. $ #' output: html_document
  6. $ #' ---
  7. $
  8. $ #' ------------------------
  9. $ #' ------------------------
  10. $
  11. $ #' **Kurs-Teil:** 06 -  Punkt, Quantoren.
  12. $ #' **URL:** https://debianforum.de/forum/viewtopic.php?t=184230
  13. $
  14. $ #' ------------------------
  15. $ #' ------------------------
  16. $
  17. $ # Aufgabe 1: "Matche mit einer RE allen Input".
  18. $ egrep --line-number "." schwaebische-kunde.txt
  19. 1:Schwaebische Kunde.
  20. 3:Als Kaiser Rothbart lobesam
  21. 4:Zum heil'gen Land gezogen kam,
  22. 5:Da musst' er mit dem frommen Heer
  23. 6:Durch ein Gebirge, wuest und leer.
  24. 7:Daselbst erhub sich grosse Noth,
  25. 8:Viel Steine gab's und wenig Brot,
  26. 9:Und mancher deutsche Reitersmann
  27. 10:Hat dort den Trunk sich abgethan.
  28. 11:Den Pferden war's so schwach im Magen,
  29. 12:Fast musst' der Reiter die Maehre tragen.
  30. 13:Nun war ein Herr aus Schwabenland,
  31. 14:Von hohem Wuchs und starker Hand,
  32. 15:Dess Roesslein war so krank und schwach,
  33. 16:Er zog es nur am Zaume nach,
  34. 17:Er haett' es nimmer aufgegeben
  35. 18:Und kostet's ihn das eigne Leben.
  36. 19:So blieb er bald ein gutes Stueck
  37. 20:Hinter dem Heereszug zurueck,
  38. 21:Da sprengten ploetzlich in die Queer
  39. 22:Fuenfzig tuerkische Reiter daher,
  40. 23:Die huben an, auf ihn zu schiessen,
  41. 24:Nach ihm zu werfen mit den Spiessen.
  42. 25:Der wackre Schwabe forcht' sich nit,
  43. 26:Ging seines Weges Schritt vor Schritt,
  44. 27:Liess sich den Schild mit Pfeilen spicken
  45. 28:Und thaet nur spoettlich um sich blicken,
  46. 29:Bis Einer, dem die Zeit zu lang,
  47. 30:Auf ihn den krummen Saebel schwang.
  48. 31:Da wallt dem Deutschen auch sein Blut,
  49. 32:Er trifft des Tuerken Pferd so gut,
  50. 33:Er haut ihm ab mit Einem Streich
  51. 34:Die beiden Vorderfuess' zugleich.
  52. 35:Als er das Thier zu Fall gebracht,
  53. 36:Da fasst er erst sein Schwerdt mit Macht,
  54. 37:Er schwingt es auf des Reiters Kopf,
  55. 38:Haut durch bis auf den Sattelknopf,
  56. 39:Haut auch den Sattel noch zu Stuecken
  57. 40:Und tief noch in des Pferdes Ruecken;
  58. 41:Zur Rechten sieht man, wie zur Linken,
  59. 42:Einen halben Tuerken heruntersinken.
  60. 43:Da packt die Andern kalter Graus,
  61. 44:Sie fliehen in alle Welt hinaus,
  62. 45:Und Jedem ist's, als wuerd' ihm mitten
  63. 46:Durch Kopf und Leib hindurchgeschnitten.
  64. 47:Drauf kam des Wegs 'ne Christenschaar,
  65. 48:Die auch zurueck geblieben war,
  66. 49:Die sahen nun mit gutem Bedacht
  67. 50:Was Arbeit unser Held gemacht.
  68. 51:Von denen hat's der Kaiser vernommen,
  69. 52:Der liess den Schwaben vor sich kommen,
  70. 53:Er sprach: "Sagt an, mein Ritter werth!
  71. 54:Wer hat Euch solche Streich' gelehrt?"
  72. 55:Der Held bedacht' sich nicht zu lang:
  73. 56:"Die Streiche sind bei uns im Schwang,
  74. 57:Sie sind bekannt im ganzen Reiche,
  75. 58:Man nennt sie halt nur Schwabenstreiche."
  76. $
  77. $ #' ------------------------
  78. $ #' ------------------------
  79. $
  80. $ # Aufgabe 2: "Extrahiere mit `egrep -o' alle Zahlen aus einem Text".
  81. $ ## Eingabetext anzeigen
  82. $ cat -n a2.txt
  83.      1  [Deutscher Dezimaltrenner (Komma)]
  84.      2  Hans hat beim Bäcker 2 Brote und 10 Brötchen und 4 Crossaints.
  85.      3  Hans' Rechnung beim Bäcker betrug 15,99 Euro.
  86.      4  Hans hat mit einem 20-Euro-Schein bezahlt. Das Rückgeld betrug somit 4,01 Euro.
  87.      5
  88.      6  [Englischer Dezimaltrenner (Punkt)]
  89.      7  Hans has 2 loaves of bread and 10 rolls and 4 croissants at the bakery.
  90.      8  Hans' bill at the bakery was 15.99 euros.
  91.      9  Hans paid with a 20 euro note. The change amounted to 4.01 euros.
  92. $ ## Zahlen mit 'egrep -o' extrahieren (sowohl Komma und Punkt als Dezimal- und/oder Tausender-Trenner erlaubt)
  93. $ egrep -o "[[:digit:]]+[.,]*[[:digit:]]*" a2.txt
  94. 2
  95. 10
  96. 4
  97. 15,99
  98. 20
  99. 4,01
  100. 2
  101. 10
  102. 4
  103. 15.99
  104. 20
  105. 4.01
  106. $
  107. $ #' ------------------------
  108. $ #' ------------------------
  109. $
  110. $ # Aufgabe 3: "Matche in einem XML-Input mit einer RE (ohne Alternation) die Beginn- und Ende-Tags `<h1>' und `</h1>'".
  111. $
  112. $ ## Input herunterladen
  113. $ wget -O "Forum_RegEx-Kurs_Teil_06.html" https://debianforum.de/forum/viewtopic.php?p=1302386
  114. --2022-05-24 13:53:46--  https://debianforum.de/forum/viewtopic.php?p=1302386
  115. Auflösen des Hostnamens debianforum.de (debianforum.de)… 142.132.203.155, 2a01:4f8:261:4fe1::2
  116. Verbindungsaufbau zu debianforum.de (debianforum.de)|142.132.203.155|:443 … verbunden.
  117. HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
  118. Länge: nicht spezifiziert [text/html]
  119. Wird in »Forum_RegEx-Kurs_Teil_06.html« gespeichert.
  120.  
  121. Forum_RegEx-Kurs_Teil_06.html                   [ <=>                                                                                        ]  60,12K  --.-KB/s    in 0,05s  
  122.  
  123. 2022-05-24 13:53:47 (1,27 MB/s) - »Forum_RegEx-Kurs_Teil_06.html« gespeichert [61568]
  124.  
  125. $
  126. $ ## Nur Tags, ohne eingeschlossenen Text)
  127. $ egrep -o --line-number "</?h1>" Forum_RegEx-Kurs_Teil_06.html
  128. 55:<h1>
  129. 55:</h1>
  130. $
  131. $ ## Ausgabe: Tags, einschließlich dem eingeschlossenen Text
  132. $ egrep -o --line-number "(<h1>)+(.)*(</h1>)+" Forum_RegEx-Kurs_Teil_06.html
  133. 55:<h1>debianforum.de</h1>
  134. $
  135. $ #' ------------------------
  136. $ #' ------------------------
  137. $
  138. $ # Aufgabe 4) "Schreibe die entsprechenden Intervallausdruecke fuer die drei anderen Quantoren: * + ?"
  139. $ ## Eingabe anzeigen
  140. $ cat -n a4.txt
  141.      1  Xa
  142.      2  X96
  143.      3  Zb
  144.      4  Zaa
  145.      5  Yaaaaaaaaaa
  146. $
  147. $ ## "*" (beliebige Zahl an Wiederholungen, auch 0 Wiederholungen möglich)
  148. $ egrep -o --line-number "(.)a{,}" a4.txt
  149. 1:Xa
  150. 2:X
  151. 2:9
  152. 2:6
  153. 3:Z
  154. 3:b
  155. 4:Zaa
  156. 5:Yaaaaaaaaaa
  157. $ egrep -o --line-number "(.)a*" a4.txt # Kontrolle mit Sternchen-Operator
  158. 1:Xa
  159. 2:X
  160. 2:9
  161. 2:6
  162. 3:Z
  163. 3:b
  164. 4:Zaa
  165. 5:Yaaaaaaaaaa
  166. $
  167. $ ## "+" (mindestens eine Wiederholung)
  168. $ egrep -o ".(a{1,})" a4.txt
  169. Xa
  170. Zaa
  171. Yaaaaaaaaaa
  172. $ egrep -o --line-number "(.)a+" a4.txt # Kontrolle mit plus-Operator
  173. 1:Xa
  174. 4:Zaa
  175. 5:Yaaaaaaaaaa
  176. $
  177. $ ## "?" (vorheriges Zeichen darf einmalig vorkommen, muss aber nicht vorkommen)
  178. $ egrep -o --line-number "(.)a{0,1}" a4.txt
  179. 1:Xa
  180. 2:X
  181. 2:9
  182. 2:6
  183. 3:Z
  184. 3:b
  185. 4:Za
  186. 4:a
  187. 5:Ya
  188. 5:aa
  189. 5:aa
  190. 5:aa
  191. 5:aa
  192. 5:a
  193. $ egrep -o --line-number "(.)a?" a4.txt # Kontrolle mit Fragezeichen-Operator
  194. 1:Xa
  195. 2:X
  196. 2:9
  197. 2:6
  198. 3:Z
  199. 3:b
  200. 4:Za
  201. 4:a
  202. 5:Ya
  203. 5:aa
  204. 5:aa
  205. 5:aa
  206. 5:aa
  207. 5:a
  208. $
  209. $ #' ------------------------
  210. $ #' ------------------------
  211. $ # Aufgabe 5) "Erklaere die RE: `**'. Auf was wird sie matchen"?
  212. $
  213. $ ## eigentlicher Ausdruck aus Aufgabe
  214. $ egrep --line-number "**" schwaebische-kunde.txt
  215. 1:Schwaebische Kunde.
  216. 2:
  217. 3:Als Kaiser Rothbart lobesam
  218. 4:Zum heil'gen Land gezogen kam,
  219. 5:Da musst' er mit dem frommen Heer
  220. 6:Durch ein Gebirge, wuest und leer.
  221. 7:Daselbst erhub sich grosse Noth,
  222. 8:Viel Steine gab's und wenig Brot,
  223. 9:Und mancher deutsche Reitersmann
  224. 10:Hat dort den Trunk sich abgethan.
  225. 11:Den Pferden war's so schwach im Magen,
  226. 12:Fast musst' der Reiter die Maehre tragen.
  227. 13:Nun war ein Herr aus Schwabenland,
  228. 14:Von hohem Wuchs und starker Hand,
  229. 15:Dess Roesslein war so krank und schwach,
  230. 16:Er zog es nur am Zaume nach,
  231. 17:Er haett' es nimmer aufgegeben
  232. 18:Und kostet's ihn das eigne Leben.
  233. 19:So blieb er bald ein gutes Stueck
  234. 20:Hinter dem Heereszug zurueck,
  235. 21:Da sprengten ploetzlich in die Queer
  236. 22:Fuenfzig tuerkische Reiter daher,
  237. 23:Die huben an, auf ihn zu schiessen,
  238. 24:Nach ihm zu werfen mit den Spiessen.
  239. 25:Der wackre Schwabe forcht' sich nit,
  240. 26:Ging seines Weges Schritt vor Schritt,
  241. 27:Liess sich den Schild mit Pfeilen spicken
  242. 28:Und thaet nur spoettlich um sich blicken,
  243. 29:Bis Einer, dem die Zeit zu lang,
  244. 30:Auf ihn den krummen Saebel schwang.
  245. 31:Da wallt dem Deutschen auch sein Blut,
  246. 32:Er trifft des Tuerken Pferd so gut,
  247. 33:Er haut ihm ab mit Einem Streich
  248. 34:Die beiden Vorderfuess' zugleich.
  249. 35:Als er das Thier zu Fall gebracht,
  250. 36:Da fasst er erst sein Schwerdt mit Macht,
  251. 37:Er schwingt es auf des Reiters Kopf,
  252. 38:Haut durch bis auf den Sattelknopf,
  253. 39:Haut auch den Sattel noch zu Stuecken
  254. 40:Und tief noch in des Pferdes Ruecken;
  255. 41:Zur Rechten sieht man, wie zur Linken,
  256. 42:Einen halben Tuerken heruntersinken.
  257. 43:Da packt die Andern kalter Graus,
  258. 44:Sie fliehen in alle Welt hinaus,
  259. 45:Und Jedem ist's, als wuerd' ihm mitten
  260. 46:Durch Kopf und Leib hindurchgeschnitten.
  261. 47:Drauf kam des Wegs 'ne Christenschaar,
  262. 48:Die auch zurueck geblieben war,
  263. 49:Die sahen nun mit gutem Bedacht
  264. 50:Was Arbeit unser Held gemacht.
  265. 51:Von denen hat's der Kaiser vernommen,
  266. 52:Der liess den Schwaben vor sich kommen,
  267. 53:Er sprach: "Sagt an, mein Ritter werth!
  268. 54:Wer hat Euch solche Streich' gelehrt?"
  269. 55:Der Held bedacht' sich nicht zu lang:
  270. 56:"Die Streiche sind bei uns im Schwang,
  271. 57:Sie sind bekannt im ganzen Reiche,
  272. 58:Man nennt sie halt nur Schwabenstreiche."
  273. $
  274. $ ## zusätzliche Klammern ergänzen, um das Lesen des Ausdrucks zu vereinfach ()
  275. $ egrep --line-number "()*()*" schwaebische-kunde.txt
  276. 1:Schwaebische Kunde.
  277. 2:
  278. 3:Als Kaiser Rothbart lobesam
  279. 4:Zum heil'gen Land gezogen kam,
  280. 5:Da musst' er mit dem frommen Heer
  281. 6:Durch ein Gebirge, wuest und leer.
  282. 7:Daselbst erhub sich grosse Noth,
  283. 8:Viel Steine gab's und wenig Brot,
  284. 9:Und mancher deutsche Reitersmann
  285. 10:Hat dort den Trunk sich abgethan.
  286. 11:Den Pferden war's so schwach im Magen,
  287. 12:Fast musst' der Reiter die Maehre tragen.
  288. 13:Nun war ein Herr aus Schwabenland,
  289. 14:Von hohem Wuchs und starker Hand,
  290. 15:Dess Roesslein war so krank und schwach,
  291. 16:Er zog es nur am Zaume nach,
  292. 17:Er haett' es nimmer aufgegeben
  293. 18:Und kostet's ihn das eigne Leben.
  294. 19:So blieb er bald ein gutes Stueck
  295. 20:Hinter dem Heereszug zurueck,
  296. 21:Da sprengten ploetzlich in die Queer
  297. 22:Fuenfzig tuerkische Reiter daher,
  298. 23:Die huben an, auf ihn zu schiessen,
  299. 24:Nach ihm zu werfen mit den Spiessen.
  300. 25:Der wackre Schwabe forcht' sich nit,
  301. 26:Ging seines Weges Schritt vor Schritt,
  302. 27:Liess sich den Schild mit Pfeilen spicken
  303. 28:Und thaet nur spoettlich um sich blicken,
  304. 29:Bis Einer, dem die Zeit zu lang,
  305. 30:Auf ihn den krummen Saebel schwang.
  306. 31:Da wallt dem Deutschen auch sein Blut,
  307. 32:Er trifft des Tuerken Pferd so gut,
  308. 33:Er haut ihm ab mit Einem Streich
  309. 34:Die beiden Vorderfuess' zugleich.
  310. 35:Als er das Thier zu Fall gebracht,
  311. 36:Da fasst er erst sein Schwerdt mit Macht,
  312. 37:Er schwingt es auf des Reiters Kopf,
  313. 38:Haut durch bis auf den Sattelknopf,
  314. 39:Haut auch den Sattel noch zu Stuecken
  315. 40:Und tief noch in des Pferdes Ruecken;
  316. 41:Zur Rechten sieht man, wie zur Linken,
  317. 42:Einen halben Tuerken heruntersinken.
  318. 43:Da packt die Andern kalter Graus,
  319. 44:Sie fliehen in alle Welt hinaus,
  320. 45:Und Jedem ist's, als wuerd' ihm mitten
  321. 46:Durch Kopf und Leib hindurchgeschnitten.
  322. 47:Drauf kam des Wegs 'ne Christenschaar,
  323. 48:Die auch zurueck geblieben war,
  324. 49:Die sahen nun mit gutem Bedacht
  325. 50:Was Arbeit unser Held gemacht.
  326. 51:Von denen hat's der Kaiser vernommen,
  327. 52:Der liess den Schwaben vor sich kommen,
  328. 53:Er sprach: "Sagt an, mein Ritter werth!
  329. 54:Wer hat Euch solche Streich' gelehrt?"
  330. 55:Der Held bedacht' sich nicht zu lang:
  331. 56:"Die Streiche sind bei uns im Schwang,
  332. 57:Sie sind bekannt im ganzen Reiche,
  333. 58:Man nennt sie halt nur Schwabenstreiche."
  334. $
  335. $ #' **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.
  336. $
  337. $ #' ------------------------
  338. $ #' ------------------------
  339. $
  340. $ #' ------------------------
  341. $ #' ------------------------
  342. $
  343. $ # Aufgabe 6) "``Bananen?'' -- Dies ist keine Frage, sondern?"
  344. $ cat -n a6.txt
  345.      1  Annanas
  346.      2  Banan
  347.      3  Banane
  348.      4  Bananen
  349.      5  Bananenn
  350.      6  Bananem
  351. $ egrep -o --line-number "Bananen?" a6.txt
  352. 3:Banane
  353. 4:Bananen
  354. 5:Bananen
  355. 6:Banane
  356. $
  357. $ #' **Antwort:** ... ein RE, der sowohl auf "Banane" als auch auf "Bananen" matcht
  358. $  
  359. $ #' ------------------------
  360. $ #' ------------------------
  361. $
  362. $ # Aufgabe 7) "Matche alles bis ``ENDE'' (inklusive)".
  363. $ ## Eingabetext anzeigen
  364. $ cat -n a7.txt
  365.      1  Das ist eine Geschichte.
  366.      2  Sie ist leider nicht sehr lang.
  367.      3  Sie ist schon jetzt zu ENDE. Ganz zu ENDE.
  368.      4  Ja das ist wirklich schon das Ende bzw. ENDE. Ja genau: Das ENDE :(
  369. $ ## bis zum _letzten_ 'ENDE' jeder Zeile
  370. $ egrep -o --line-number "(.)*(ENDE){1}" a7.txt
  371. 3:Sie ist schon jetzt zu ENDE. Ganz zu ENDE
  372. 4:Ja das ist wirklich schon das Ende bzw. ENDE. Ja genau: Das ENDE
  373. $ ## bis zum _letzten_ 'ENDE' in jener Zeile, in der das Wort 'ENDE' zum ersten mal auftritt
  374. $ egrep -o --max-count 1 --line-number "(.)*(ENDE){1}" a7.txt
  375. 3:Sie ist schon jetzt zu ENDE. Ganz zu ENDE
  376. $ ## bis zum _ersten_ 'ENDE' der jeder Zeile
  377. $ ### --> Habe hierfür leider keine Lösung herausgefinden können.
  378. $ ## bis zum _allerersten_ 'ENDE' des Textes
  379. $ ### --> Habe hierfür leider keine Lösung herausgefinden können.
  380. $
  381. $ #' ------------------------
  382. $ #' ------------------------
  383. $
  384. $ # Aufgabe 8 "Matche den Inhalt eines Single-Quoted Strings (dieser kann das Single-Quote nicht enthalten)."
  385. $ ## Gesamter Zeichenkette (einschließlich des Single-Quoted-String) definiernen und in einer Datei abspeichern
  386. $ printf "Das Folgende ist ein 'Single-Quoted String'. Danach ist es wieder ein normaler String" > a8_input.txt
  387. $ printf "\n"
  388.  
  389. $ ## Reguläre Ausdruck definieren und in eine Datei abspeichern
  390. $ printf "(')(.)*(')" > a8_regex.txt
  391. $ printf "\n"
  392.  
  393. $ ## Abgespeicherten regulären Ausdruck auf abspeicherte Zeichenkette anwenden
  394. $ egrep -o -f a8_regex.txt a8_input.txt
  395. 'Single-Quoted String'
  396. $
  397. $ #' ------------------------
  398. $ #' ------------------------
  399. $
  400. $ # 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!)".
  401. $
  402. $ ## Satz anzeigen
  403. $ cat a9.txt
  404. Das ist der erste Satz. Und was ist das? Ein weiterer Satz!
  405. $
  406. $ ## egrep ausführen bzw. RE anwenden
  407. $ ### **Anmerkung (1):** Einzelne Anführungszeichen sind hier scheinbar (?) notwendig, weil die Shell sonst eine Fehlermeldung ausgibt ("[...] event not found")
  408. $ egrep -o '[[:upper:]][^?.!:]*([?.!:])' a9.txt
  409. Das ist der erste Satz.
  410. Und was ist das?
  411. Ein weiterer Satz!
  412. $
  413. $ #' ------------------------
  414. $ #' ------------------------
  415. $
  416. $ # Aufgabe 10: "Matche grosse Geldwerte mit Tausendertrenner."
  417. $ ## Eingabe anzeigen
  418. $ cat a10.txt
  419. 100000
  420. 100000 Euro
  421. 10.000 Euro
  422. 70.000 €
  423. 537,28 Euro
  424. 890.785,71€
  425. 7.55 Euro
  426.  
  427.  
  428. $ ## egrep ausführen bzw. RE anwenden
  429. $ egrep -o --line-number "([[:digit:]]|,)*([.][[:digit:]]{3,3})(,[[:digit:]]{2})?([[:blank:]])?(Euro|€)*" a10.txt
  430. 3:10.000 Euro
  431. 4:70.000 €
  432. 6:890.785,71€
  433. $
  434. $ #' ------------------------
  435. $ #' ------------------------
  436. $
  437. $ # Aufgabe 11: "Finde ein sinnhaftes Praxisbeispiel fuer eine RE mit Punkt aber ohne Quantoren."
  438. $
  439. $ #' **ANTWORT bzw. Beispiel;** Kontrollieren, ob eine gewählte Abkürzung eine eine Länge von von genau drei Zeichen einhält.
  440. $
  441. $ ## Eingabe anzeigen
  442. $ cat a11.txt
  443. g23
  444. abX
  445. AbHUi5g
  446. 125
  447. 14 h
  448. $
  449. $ # egrep ausführen bzw. RE anwenden
  450. $ egrep -o --line-number "^(...)$" a11.txt
  451. 1:g23
  452. 2:abX
  453. 4:125
  454. $
  455. $ #' ------------------------
  456. $ #' ------------------------
  457. $
  458.  

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN