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)
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)
|
) 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)
> egrep --color '^teve[0-9]' camels.txt teve98 teve4life teve123456 teve7
Magyarázat:
^teve
jelenti azt, hogy a teve
szövegnek a sor elején kell szerepelnie.[0-9]
jelöli a feladat által kért számjegy karaktert. A []
-ek általános jelentése a következő: "a []
-ek közti karaktersorozat egyetlen karakterének az előfordulását vizsgáljuk". Persze a []
-ek között legépelhettük volna manuálisan is 0-tól 9-ig a számjegyeket, de ennél jóval elegánsabb a korábban ismertetett megoldás.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)
> egrep --color '^teve[0-9]*$' camels.txt teve98 teve teve123456 teve7
Magyarázat:
^teve
azt mondja meg, hogy a sor a teve
szöveggel kezdődik (ezt már tudjuk).[0-9]*
azt mondja meg, hogy számjegyekből tetszőlegesen sok szerepelhet. A *
(csillag) szimbólum használata esetén a "tetszőlegesen sok"-ba akár a 0 darab illeszkedés is beletartozik, emiatt a teve
sor is kiválogatásra kerül, amiben egyetlen számjegy sem szerepel.$
(dollárjel) szimbólum jelzi a sor végét.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)
> 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)
> egrep --color '^teve[0-9]{2}$' camels.txt
teve98
Magyarázat:
^teve
azt mondja meg, hogy a sor a teve
szöveggel kezdődik (ezt már tudjuk).[0-9]{2}
azt mondja meg, hogy pontosan 2 darab, egymást követő számjegyet keresünk. Általánosan is igaz, hogy a (KIF){SZAM}
azt jelenti, hogy a KIF
kifejezésből SZAM
darab szerepel egymás után.$
szimbólum jelzi a sor végét (ezt már tudjuk).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)
> 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:
^teve[0-9]{2,}$
: kiválogatja azokat a sorokat, amelyek a teve
szöveggel kezdődnek, ami után legalább 2 darab számjegy szerepel egészen a sor végéig.^teve[0-9]{,5}$
: kiválogatja azokat a sorokat, amelyek a teve
szöveggel kezdődnek, ami után legfeljebb 5 darab számjegy szerepel egészen a sor végéig (itt tulajdonképpen a 0 lesz az alsó korlátunk).8. ...csak nagybetűket és alulvonás (_
) karaktereket tartalmaz! (2 pont)
> 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)
> egrep --color '^teve(.)*[0-9]$' camels.txt teve98 teve_4ever444 teve123456 tevekiraly20 teve_suttogo_2 teve7
Magyarázat:
^teve
azt mondja meg, hogy a sor a teve
szöveggel kezdődik (ezt már tudjuk)..
(pont) a reguláris kifejezések világában. Mivel a 0 darab tetszőleges karakter is jó, ezért itt a "tetszőleges mennyiség" alatt a *
-ot értjük (nem a +
-t). Érdemes az egyértelműség kedvéért bezárójelezni azt a részkifejezést, amire a *
vonatkozik.[0-9]$
azt mondja meg, hogy a sor számjegyre kell, hogy végződjön.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)
> egrep --color '^teve(_)?[A-Za-z0-9]+[0-9]$' camels.txt teve98 teve_4ever444 teve123456 tevekiraly20
Magyarázat:
^teve
azt mondja meg, hogy a sor a teve
szöveggel kezdődik (ezt már tudjuk).?
(kérdőjel). Érdemes az egyértelműség kedvéért bezárójelezni azt a részkifejezést, amire a ?
vonatkozik.[A-Za-z0-9]+
azt mondja meg, hogy betűből (itt a nagybetűk és kisbetűk is játszanak) vagy számjegyből legalább 1 darabnak szerepelnie kell.[0-9]$
azt mondja meg, hogy a sor számjegyre kell, hogy végződjön (ezt már tudjuk).11. ...nem az angol ábécé valamely magánhangzójával kezdődik! (1 pont)
> 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)
> 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.