NoPaste

Ausgabe_RegExp_Kurs_04

von tegula

SNIPPET_TEXT:
  1. $ #' ---
  2. $ #' title: "Lösungsversuch zum RegEXP-Kurs im Debianforum"
  3. $ #' author: "tegula"
  4. $ #' date: " 10 05 2022"
  5. $ #' output: html_document
  6. $ #' ---
  7. $
  8. $
  9. $ #' ------------------------
  10. $ #' ------------------------
  11. $ #' **Kurs-Teil:** 05 -  Zeichenklassen
  12. $ #' **URL:** https://debianforum.de/forum/viewtopic.php?p=1301642#p1301642
  13. $
  14. $ #' ------------------------
  15. $ #' ------------------------
  16. $
  17. $ # Aufgabe 1: "Re für eine Hexadezimalziffer""
  18. $ cat input_a1.txt
  19. 0
  20. A
  21. 7
  22. B
  23. 9
  24. F
  25. Z
  26. Y
  27. D
  28. $ egrep "[[:xdigit:]]" input_a1.txt
  29. 0
  30. A
  31. 7
  32. B
  33. 9
  34. F
  35. D
  36. $
  37. $ #' ------------------------
  38. $ #' ------------------------
  39. $
  40. $ # Aufgabe 2: RE fuer eine dreistellige Ganzzahl
  41. $ cat input_a2.txt
  42. 197
  43. 2022
  44. 55
  45. 44.3
  46. 44,3
  47. hallo
  48. 2
  49. 999
  50. 1000
  51. $ ## Muster (für eine dreistellige Zahl muss folgendes sein: Anfang der Zeichenkette ("^"), dreimal hintereinander Dezimalziffer ("[[:digit:]]{3,3}"), Ende der Zeichenkette ("$")
  52. $ egrep "^[[:digit:]]{3,3}$"  input_a2.txt
  53. 197
  54. 999
  55. $
  56. $ #' ------------------------
  57. $ #' ------------------------
  58. $
  59. $ # Aufgabe 3: "RE fuer eine dreistellige Ganzzahl mit (Pflicht-)Vorzeichen".
  60. $ cat input_a3.txt
  61. 700
  62. -hallo
  63. -311
  64. +12
  65. +1000
  66. +128
  67. $ egrep "^(\+|-)[[:digit:]]{3,3}$" input_a3.txt
  68. -311
  69. +128
  70. $
  71. $ #' ------------------------
  72. $ #' ------------------------
  73. $
  74. $
  75. $ # Aufgabe 4: "RE fuer einen Euro-und-Cent-Betrag kleiner 10,- [Euro]"
  76. $
  77. $ ## Unterausdrücke definieren und als Shell-Variablen abspeichern
  78. $ euro_und_cent="^[[:digit:]]{1,1},[[:digit:]]{2,2}[[:space:]](Euro|€)$" # 0,00 Euro bis 10,00 Euro
  79. $ nur_euro="^[[:digit:]]{1,1}[[:space:]](Euro|€)$" # 0 Euro bis 10 Euro
  80. $ nur_cent="^[[:digit:]]{1,3}[[:space:]](Cent|ct|c|¢)$" # 0 Cent bis 1000 Cent
  81. $
  82. $ ## Gesamtausdruck aus den Unterausdrücken zusammenfügen und als Shell-Variablen abspeichern
  83. $ gesamt="(${euro_und_cent})|(${nur_euro})|(${nur_cent})"
  84. $ printf "${gesamt}\n"
  85. (^[[:digit:]]{1,1},[[:digit:]]{2,2}[[:space:]](Euro|€)$)|(^[[:digit:]]{1,1}[[:space:]](Euro|€)$)|(^[[:digit:]]{1,3}[[:space:]](Cent|ct|c|¢)$)
  86. $
  87. $ ## Input anzeigen
  88. $ cat input_a4.txt
  89. 3,35 Euro
  90. 7 Euro
  91. 22,66 Euro
  92. 5,00 Dollar
  93. 0,10 €
  94. 555 €
  95. 10 Cent
  96. 99 ct
  97. $
  98. $ ## Gesamtausdruck auf Input anwenden
  99. $ egrep $gesamt input_a4.txt
  100. 3,35 Euro
  101. 7 Euro
  102. 0,10 €
  103. 10 Cent
  104. 99 ct
  105. $
  106. $ #' ------------------------
  107. $ #' ------------------------
  108. $
  109. $ # Aufgabe 5) "RE fuer die 31 Tage des Januars (zweistelliges Format mit fuehrender Null). Zwei Varianten".
  110. $
  111. $ # Unterausdrucke definieren
  112. $ tag_zuerst="^(31|30|[012][[:digit:]])(\.)(01)$"
  113. $ monat_zuerst="^(01)(/)(31|30|[012][[:digit:]])$"
  114. $
  115. $ # Gesamtausdruck zusammenfügen
  116. $ gesamt="(${tag_zuerst})|(${monat_zuerst})"
  117. $ printf "${gesamt}\n"
  118. (^(31|30|[012][[:digit:]])(\.)(01)$)|(^(01)(/)(31|30|[012][[:digit:]])$)
  119. $
  120. $ # Input anzeigen
  121. $ cat input_a5.txt
  122. 31.12
  123. 31.01
  124. 05.01
  125. 06.01
  126. 40.01
  127. 01/12
  128. 01/33
  129. 04/08
  130. 01/30
  131. $
  132. $ # Gesamtausdruck auf Input anwenden
  133. $ egrep $gesamt input_a5.txt
  134. 31.01
  135. 05.01
  136. 06.01
  137. 01/12
  138. 01/30
  139. $
  140. $ #' ------------------------
  141. $ #' ------------------------
  142. $
  143. $ # Aufgabe 6) "RE fuer die 28 Tage des Februars (zweistelliges Format mit fuehrender Null). Zwei Varianten."
  144. $
  145. $ # Unterausdrucke definieren
  146. $ tag_zuerst="^(28|27|26|25|24|23|22|21|20|[01][[:digit:]])(\.)(02)$"
  147. $ monat_zuerst="^(02)(/)(28|27|26|25|24|23|22|21|20|[01][[:digit:]])$"
  148. $
  149. $ # Gesamtausdruck zusammenfügen
  150. $ gesamt="(${tag_zuerst})|(${monat_zuerst})"
  151. $ printf "${gesamt}\n"
  152. (^(28|27|26|25|24|23|22|21|20|[01][[:digit:]])(\.)(02)$)|(^(02)(/)(28|27|26|25|24|23|22|21|20|[01][[:digit:]])$)
  153. $
  154. $ # Input anzeigen
  155. $ cat input_a6.txt
  156. 01.02
  157. 28.02
  158. 30.02
  159. 28.07
  160. 02/09
  161. 29/02
  162. 02/11
  163. $
  164. $ # Gesamtausdruck auf Input anwenden
  165. $ egrep $gesamt input_a6.txt
  166. 01.02
  167. 28.02
  168. 02/09
  169. 02/11
  170. $
  171. $ #' ------------------------
  172. $ #' ------------------------
  173. $
  174. $ # Aufgabe 7) RE fuer ein beliebiges Zeichen, das kein Buchstabe is
  175. $ cat input_a7.txt
  176. 7
  177. 45
  178. A
  179. (
  180. H
  181. X
  182. ?
  183. Z
  184. -
  185. +
  186. 0
  187. 1
  188. $ egrep "^[^[:alpha:]]$" input_a7.txt
  189. 7
  190. (
  191. ?
  192. -
  193. +
  194. 0
  195. 1
  196. $
  197. $ #' ------------------------
  198. $ #' ------------------------
  199. $
  200. $
  201. $ # Aufgabe  8) RE für eine beliebige Ziffer (Drei verschiedene Varianten)
  202. $ cat input_a7.txt
  203. 7
  204. 45
  205. A
  206. (
  207. H
  208. X
  209. ?
  210. Z
  211. -
  212. +
  213. 0
  214. 1
  215. $ egrep "^[[:digit:]]$" input_a7.txt
  216. 7
  217. 0
  218. 1
  219. $ egrep "^[0123456789]$" input_a7.txt
  220. 7
  221. 0
  222. 1
  223. $ egrep "^[0-9]$" input_a7.txt
  224. 7
  225. 0
  226. 1
  227. $
  228. $ #' ------------------------
  229. $ #' ------------------------
  230. $
  231. $ # Aufgabe 9) "RE fuer ein Zeichen, das kein Circumflex (^) ist."
  232. $ cat input_a9.txt
  233. a
  234. ^
  235. ?
  236. Mehrere_Zeichen
  237. B
  238. $ egrep "^[^^]$" input_a9.txt
  239. a
  240. ?
  241. B
  242. $
  243. $ #' ------------------------
  244. $ #' ------------------------
  245. $
  246. $
  247. $ # Aufgabe 10) "RE fuer eine Zeichenklasse, die nur einen Circumflex matcht.""
  248. $ egrep "^[\^]$" input_a9.txt
  249. ^
  250. $
  251. $ #' ------------------------
  252. $ #' ------------------------
  253. $
  254. $
  255. $ # Aufgabe 11) RE fuer ein Minus oder eine eckige Klammer.
  256. $ cat input_a11.txt
  257. -
  258. +
  259. a
  260. 9
  261. [
  262. ]
  263. /
  264. $ egrep "^(-|\[|\])$" input_a11.txt
  265. -
  266. [
  267. ]
  268. $
  269. $ #' ------------------------
  270. $ #' ------------------------
  271. $
  272. $
  273. $ # Aufgabe 12) "RE die alles ausser einer schliessenden eckigen Klammer oder einem Circumflex matcht".
  274. $ cat input_a12.txt
  275. ]
  276. [
  277. ^
  278. a
  279. 7
  280. $ egrep "^[^]]" input_a12.txt
  281. [
  282. ^
  283. a
  284. 7
  285. $
  286. $ # Aufgabe 13) "Schreibe zwei verschiedene REs, die beide einen Backslash matchen".
  287. $ # Input anzeigen
  288. $ cat input_a13.txt
  289. \
  290. /
  291. A
  292. z
  293. 9
  294. $ ## Variante 1
  295. $ egrep '\\' input_a13.txt # Auf Shell sind hier anscheinend zwingend einfache (statt dopelte) Anführungszeichen notwendig (??)
  296. \
  297. $ ## Variante 2
  298. $ egrep "[\]" input_a13.txt # Auf Shell sind hier anscheinend zwingend einfach Anführungszeichen notwendig
  299. \
  300. $
  301. $ #' ------------------------
  302. $ #' ------------------------
  303. $
  304. $ # Aufgabe 14) "Was matcht die Zeichenklasse `[A-z]' ausser Buchstaben sonst noch? (Zeichensatz: US-ASCII)"
  305. $ #' --> Konnte diese Aufgabe  nicht lösen.
  306. $
  307. $ #' ------------------------
  308. $ #' ------------------------
  309. $
  310. $ # Aufgabe 15) "RE, die einen Tab matcht. Versuche mehrere Varianten zu finden."
  311. $
  312. $ ## Inputdatei erstellen
  313. $ printf "hallo du da\nhallo\tdu\tda" > input_aufgabe15.txt
  314. $ ## RE auf Inputdatei anwenden
  315. $ ### Anmerkung: Das Vorgehen (Umweg über printf), um Tabulator eingeben zu können, habe ich folgender URL entnommen: https://askubuntu.com/a/53096
  316. $ egrep "$(printf '\t')" input_aufgabe15.txt
  317. hallo   du      da
  318. $ egrep "$(printf '[\t]')" input_aufgabe15.txt
  319. hallo   du      da
  320. $
  321. $ #' ------------------------
  322. $ #' ------------------------
  323. $ #'
  324. $
  325. $ # Aufgabe 16) "Schreibe einen egrep-Ausdruck (nun auch mit Zeichenklassen), um die Schreibweisen Maier, Meier, Mayer, Meier und Myer zu matchen."
  326. $ cat input_a16.txt
  327. Maier
  328. Meier
  329. Mayer
  330. Meier
  331. Myer
  332. Müller
  333. Maiar
  334. $ egrep "(^M[ae][iy]er$)|(^Myer$)" input_a16.txt
  335. Maier
  336. Meier
  337. Mayer
  338. Meier
  339. Myer
  340. $
  341. $ #' ------------------------
  342. $ #' ------------------------
  343. $ #' [ENDE]
  344. $
  345.  

Quellcode

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