Operációs rendszerek gyakorlat

Reguláris kifejezéses feladatok - Egy lehetséges megoldás

Megjegyzés: A feladatsor megoldásához az A1 anyagrész (azon belül is a reguláris kifejezésekről szóló alfejezet) ismerete szükséges.

Teve (20 pont)

A TeveClub weboldalon virtuálisan nevelhetünk tevéket. A camels.txt fájl (letöltés) egyes soraiban egy-egy tevének a neve szerepel, amit az oldalon regisztráltak.

Válogasd ki a fájlból egy-egy reguláris kifejezéssel azokat a tevéket, akiknek a neve...

1. ...tartalmazza a teve szöveget! (1 pont)

Megoldás: Ez még egy egyszerű feladat, aminek a megoldása valószínűleg mindenkinek menni fog, aki az első ZH-t túlélte. Az egrep paranccsal kiválogatjuk azokat a sorokat a bemeneti fájlból, amelyek tartalmazzák a teve szöveget. A szemléletesség kedvéért használjuk a --color kapcsolót is, ami minden sorban kiszínezi azokat a részeket, ahol az egrep megtalálta a reguláris kifejezésre illeszkedő stringet.
> egrep --color 'teve' camels.txt
egypupu_teve12
teve98
teve
epic_teve_42
teve4life
teve_4ever444
teve123456
tevekiraly20
teve_suttogo_2
teve_4ever
teve7

2. ...tartalmazza a teve és az epic szövegek legalább egyikét! (1 pont)

Megoldás: Ha egynél több mintára is szeretnénk illeszteni egy reguláris kifejezésben, akkor az illesztendő mintákat a VAGY ( |) művelettel kötjük össze.
> egrep --color 'teve|epic' camels.txt
egypupu_teve12
teve98
teve
epic_teve_42
teve4life
my epic camel with wings and lazer eyes
teve_4ever444
teve123456
tevekiraly20
teve_suttogo_2
teve_4ever
teve7

Megjegyzendő, hogy a reguláris kifejezések világában a VAGY művelet nem a kizáró VAGY, hanem a megengedő VAGY. Például az epic_teve_42 sorban jól láthatjuk a színezésből, hogy az egrep mindkét megadott mintára, a teve és az epic szövegekre egyaránt illesztett.

3. ...a teve szöveggel kezdődik, ami után számjegy következik! (2 pont)

Megoldás: A további példákban először leírjuk a feladat megoldásaként kapott reguláris kifejezést, utána pedig részletesen is kivesézzük annak a felépítését, működését. A reguláris kifejezésünk most:
> egrep --color '^teve[0-9]' camels.txt
teve98
teve4life
teve123456
teve7

Magyarázat:

4. ...a teve szöveggel kezdődik, ami után kizárólag számjegyek következhetnek egészen a név végéig! A számjegyekből tetszőleges mennyiségű (akár 0 darab is) lehet. (2 pont)

Megoldás:
> egrep --color '^teve[0-9]*$' camels.txt
teve98
teve
teve123456
teve7

Magyarázat:

5. ...a teve szöveggel kezdődik, ami után kizárólag számjegyek következhetnek egészen a név végéig! Legalább 1 számjegynek mindenképpen szerepelnie kell! (1 pont)

Megoldás:
> egrep --color '^teve[0-9]+$' camels.txt
teve98
teve123456
teve7

Itt annyi a különbség az előző feladathoz képest, hogy a 0 darab számjegyet nem fogadjuk el, hanem megköveteljük, hogy legalább 1 számjegynek mindenképpen szerepelnie kell. Ennek a biztosítására szolgál a + (plusz) szimbólum a reguláris kifejezések világában.

6. ...a teve szöveggel kezdődik, ami után pontosan 2 számjegy szerepel, és a teve neve itt ér végét (tehát az ennél bővebb nevek nem fogadhatók el)! (1 pont)

Megoldás:
> egrep --color '^teve[0-9]{2}$' camels.txt
teve98

Magyarázat:

7. ...a teve szöveggel kezdődik, ami után legalább 1, de legfeljebb 5 számjegy következik, és a teve neve itt ér véget (tehát az ennél bővebb nevek nem fogadhatók el)! (1 pont)

Megoldás:
> egrep --color '^teve[0-9]{1,5}$' camels.txt
teve98
teve7

Magyarázat: A megoldás nagyon hasonlít az előző feladat megoldásához. Annyi a különbség, hogy {}-ek között egy alsó és egy felső korlátot is megadunk. Általánosan: a (KIF){SZAM1,SZAM2} azt jelenti, hogy a KIF kifejezésből legalább SZAM1, de legfeljebb SZAM2 szerepelhet egymás után.

Persze olyat is csinálhatunk, hogy az alsó és a felső korlátok közül csak az egyiket adjuk meg:

8. ...csak nagybetűket és alulvonás (_) karaktereket tartalmaz! (2 pont)

Megoldás:
> egrep --color '^[A-Z_]+$' camels.txt
CAMELON_DIAZ
NEMZSIRAF

Magyarázat: Nagybetűkből és alulvonás karakterekből szeretnénk tetszőlegesen sokat, de legalább 1-et mindenképpen ([A-Z_]+ részkifejezés). Továbbá szeretnénk, ha a teljes sor csak ezeket a karaktereket tartalmazná (ezért kiírjuk a kifejezés elejére a ^-ot, a végére pedig a $-et).

9. ...a teve szöveggel kezdődik, ami után tetszőleges mennyiségű (akár 0 darab) tetszőleges karakter következik, majd a név számjegyre végződik! (2 pont)

Megoldás:
> egrep --color '^teve(.)*[0-9]$' camels.txt
teve98
teve_4ever444
teve123456
tevekiraly20
teve_suttogo_2
teve7

Magyarázat:

10. ...a teve szöveggel kezdődik, ami után vagy szerepel alulvonás vagy nem, majd legalább 1 betű vagy számjegy következik, majd közvetlenül ezután egy számjegy jelzi a teve nevének végét! (3 pont)

Megoldás:
> egrep --color '^teve(_)?[A-Za-z0-9]+[0-9]$' camels.txt
teve98
teve_4ever444
teve123456
tevekiraly20

Magyarázat:

11. ...nem az angol ábécé valamely magánhangzójával kezdődik! (1 pont)

Megoldás:
> egrep --color '^[^AEIOUaeiou]' camels.txt
teve98
CAMELON_DIAZ
teve
teve4life
my epic camel with wings and lazer eyes
STEVE_JOBS_07
teve_4ever444
teve123456
NEMZSIRAF
tevekiraly20
lost_in_sahara_send_help_pls
teve_suttogo_2
teve_4ever
teve7

Magyarázat: Ebben a feladatban az egyetlen újdonság a szögletes zárójeleken belül használt "kalapjel". A [^HALMAZ] azt jelenti, hogy a HALMAZ-ban nem szereplő karaktereket keressük. Mivel most a "nem magánhangzók" érdekelnek minket, ezért a HALMAZ helyén az angol ábécé magánhangzóit adjuk meg.

12. ...páratlan sok karakterből áll! (3 pont)

Megoldás:
> egrep --color '^(..)*.$' camels.txt
teve4life
my epic camel with wings and lazer eyes
STEVE_JOBS_07
teve_4ever444
NEMZSIRAF
teve7

Magyarázat: A (..)* garantálja azt, hogy páros sok karakterünk legyen, hiszen 2 darab tetszőleges karakterből van tetszőlegesen sok (akár 0 is). Ezután a páros sok karakter után még szerepeltetünk 1 darab tetszőleges karaktert, ily módon páratlan sok karakterünk lesz ((..)*. belső rész magyarázata). Ez a minta a teljes vizsgált stringre vonatkozik, tehát kiírjuk a string elejét jelző ^, illetve a string végét jelző $ karaktereket.