Egy IRC beszélgetés-szerü hogyan-t szeretnék közzétenni, amely a regular expression alapjait mutatja be. Ime egy kis ízelítö:
Glaucon: soha nem hasznaltam sed-et Glaucon: tudom, hogy nez ki, de aztan annyi :) Socrates: es kivancsi vagy ra ? Glaucon: persze, erdekel... Socrates: akkor lassunk neki :] Socrates: naszoval. sed-el sokfele dolgot lehet csinalni, ezek tobbsege a man oldalon le vagyon irva. talan az egyetlen ami onnan hianyzik, az a regexpek Glaucon: hat ja ;-) Socrates: hogy mi az a tobbi, ami le vagyon irva, arra visszaterunk kesobb Glaucon: ok. Socrates: azt ugyis eleg ritkan hasznalja az ember Socrates: szoval regexpek Glaucon: ok. Socrates: hogy az ember elete ne legyen konnyu, regexpbol is van sokfele Glaucon: :) Socrates: van a POSIX regexp (amit sed is hasznal), es van a perl-style regexp, es van az emacs regexp is Glaucon: wow (en csak az elsorol tudtam:) Socrates: szal ha latsz valami szepet perl-ben az sed-el szinte biztos nem fog menni es forditva is Socrates: mondjuk eleg konnyu atalakitani Socrates: (errol is majd kesobb) Socrates: most foglalkozzunk szepen es jol a regexpek alapjaival Glaucon: ok Socrates: a regexpeket arra talaltak ki, hogy szovegeket lehessen veluk "matchelni" bizonyos leiras alapjan Socrates: azaz, le lehessen irni bizonyos rovidebb formulakkal, hogy milyen szovegre kivanjuk a regexpet illeszteni Socrates: ezt valahogy ugy lehetne elkepzelni, hogy van 1 kepkereted (regexp) es megkeresed a bele illo kepet (szoveg) Socrates: eddig ertheto vagyok? Glaucon: igen Socrates: ok Socrates: a regexpek alapjai a betuk/karakterek: a, b, c, d, satobbi Socrates: es a kereses mindig az adott szoveg (sed eseten sor) elejerol kezdodik Glaucon: okay Socrates: szoval ha van egy szovegem: abcdefgh, akkor arra az abcd regexp illeszkedni fog Socrates: (mivel a szovegben elofordul abcd) Socrates: ebben asszem semmi ordongosseg nincsen, ugye? Glaucon: nincs :) Socrates: aztan, vannak specialis karakterek Socrates: bar, tulajdonkeppen csak egy: a pont (.) Socrates: jameg a \, amivel escapelni lehet ugyebar Glaucon: igenigen :) Socrates: a . az az univerzalis karakter, ami mindenre matchel Socrates: szoval ha van egy szovegem: abcdef, es a regexp ab.d, akkor matchelni fog Socrates: ugyanez az ab.d matchelni fog az abXdfooobarjol szovegre is Socrates: (illetve annak abXd reszere) Glaucon: es nem kell escapelni ? Socrates: nem Glaucon: okay, na ezt pl. meg nem tudtam :) Socrates: \. az magat a . karaktert jelentene Glaucon: ja igen, ertheto Socrates: nem pedig az univerzalis-karaktert Socrates: szoval vegeztunk . -al es \ is, ugye? Glaucon: igen Socrates: jo. akkor most jonnek a "tobbszorozo operatorok" Glaucon: huha Socrates: ezek a *, a \+, es meg egy masik, amirol kesobb lesz szo Glaucon: ok Socrates: a * azt jelenti, hogy akarhany (0 vagy tobb) darab abbol a valamibol ami kozvetlenul elotte all Socrates: ha van egy abbbbbbbc szovegem, akkor az ab*c regexp matchelni fog ra Socrates: ugyanez az ab*c matchelni fog az ac szovegre is Socrates: mert a es c kozott van 0 darab b, es * megengedi hogy 0 db legyen Glaucon: humm Glaucon: es a "." csak 1 -re matchelhet ? Socrates: igen Socrates: de .* akarhany karakterre Glaucon: ertem, de Glaucon: ab*c miert csak ac-t hoz ki ? Socrates: akarmennyi az univerzalis karakterbol Socrates: nem hoz ki, matchel ra Socrates: 0 vagy tobb b Glaucon: aha Glaucon: tehat ha van pl : abbbbbbbbc Glaucon: abbol ab*c Glaucon: az lehet a teljes match Socrates: aham Glaucon: vagy csak ac Socrates: nem Socrates: abbbbbc -bol ab*c a teljeset kihozza Socrates: mindig Socrates: ac -bol ab*c ac-t hozza ki Glaucon: ugyanez az ab*c matchelni fog az ac szovegre is Socrates: aham Glaucon: jaa Glaucon: ertem mar :-) Socrates: ugyanaz a regexp ket kulonbozo szovegre is illeszteheto, ja Glaucon: okay. Socrates: akkor tesztkerdes: Glaucon: ok, johet Socrates: adott az abbccddefghhhjk szoveg Socrates: illeszkedik-e erre a kovetkezo regexp: c*d*ex*.g Socrates: (jol gondold meg) Glaucon: igen Socrates: el tudod mondani miert? Glaucon: ugye jobbrol balra megyunk Glaucon: c-vel kezdodik a regexp Glaucon: c utan johet akarhany c Glaucon: d utan is Glaucon: e utan meg lehet akar 0 x is Glaucon: es azutan kovetkezik g Socrates: majdnem Glaucon: helyes a valasz ? :) Socrates: e utan johet 0 x, de e utan f jon Socrates: nem pedig g Socrates: mas szoval, a "." -ot kihagytad Glaucon: hat Glaucon: a . az = f Glaucon: ebben a peldaban Socrates: jahm Socrates: jo, akkor lepjunk tovabb \+ -ra Glaucon: nincs tobb pelda ? Socrates: legyen? Glaucon: szerintem igen :) Glaucon: meg 2, ha nem gond Glaucon: gyakorolni kell ezt meg Socrates: okes Glaucon: csak hogy tenyleg ertsem... Socrates: van az a szoveg, hogy: aaaaaaaaaaaaaaaaaaaaaiiiiieeeerk! Socrates: illeszkedik-e erre a kovetkezo regexp: a*i...e*r ? Glaucon: nem Socrates: miert? Glaucon: mivel az "i" utani 3 "." nem eleg, mivel van ott egy negyedik "i" is Socrates: pontosan Glaucon: ha meg egy pont lenne Glaucon: akkor esetleg :) Socrates: ha meg 1 lenne akkor tuti :) Glaucon: igen Socrates: illeszkedik-e a "ratatatabummbumm" szovegre a r.v*.*ta*b regexp? Glaucon: igen Socrates: miert? Glaucon: mivel az r utan a pont az "a" helyett van, azutan nincs "v" de nem is kell (mivel lehet 0 is) azutan a ".*" az mindent egybefog, egeszen tabummbumm -ig, ott meg a "ta*b" matchel ra Socrates: helyes Glaucon: kiraly :)) Glaucon: ezt probalas nelkul csinalom am !! Socrates: azert kerdezem vissza hogy miert matchel, hogy lassam tudod-e Socrates: ha a miertre nem tudod a valaszt, azon probalgatas sem segitene Socrates: akkor most tovabb \+ -ra! Socrates: \+ az olyan mint a *, csak nem engedi meg a 0 -at, azaz \+ azt jelenti, hogy ami elotte van, abbol egy vagy tobb (tehat nem lehet abbol 0) Socrates: akkor rogton ra is ternek a peldakra,ok? Glaucon: tehat _legalabb_ 1-nek lennie kell Socrates: jahm, legalabb 1 Glaucon: persze, johet a pelda Socrates: adott a fooobar szoveg, illeszkedik-e ra az f*o\+bar\+ regexp? Glaucon: nem Socrates: miert? Glaucon: mivel a vegen levo "\+" nem jo, mivel nincs az mogott semmi es _legalabb_ 1-nek lennie kell Socrates: es van is legalabb 1 Socrates: r\+ a vege, es foobar vegen ott van legalabb egy r Glaucon: :( Glaucon: tenyleg Socrates: sebaj. elsore ezt mindenki elszurja :) Glaucon: azt hittem az "r" utan lennie kell vminek Glaucon: ezert jo ez a pelda :) Socrates: akkor . lett volna r utan es \+ elott Socrates: (r.\+) Glaucon: ja, ertem Socrates: amit fejben kell tartani, hogy \+ azt jelenti, hogy 1 vagy tobb, az elotte levovel _egyutt_, es nem 1 vagy tobb az elotte levon _kivul_ Glaucon: ja, ez nem volt vilagos Socrates: ugyanez igaz *-ra is btw Glaucon: csak az escapeles elotte megkavart Socrates: ja, az szivas sed-nel, hogy \+ -t escapelve kell irni :( Socrates: perl-nel jobbabb, ot nem kell :) Socrates: sokkal erthetobb ugy, imho Glaucon: /* es mivan ha escape nelkul irjuk ? */ Socrates: ha escape nelkul irod, akkor az a + karaktert jelenti Glaucon: ertem Socrates: sed nagyon okos Socrates: meglatja a .\+ -t Socrates: ez azt jelenti hogy 1 vagy tobb "akarmilyen karakter" Socrates: ez vegig is fut a regexp maradekan, es a vegen nem marad semmi Glaucon: a ".\+" annyit jelent , hogy a "." helyett lehet akarmi es abbol kell legalabb 1 karakter legyen, mivel a "." is azt mondja, de abbol azutan lehet tobb is Socrates: valahogy ugy Glaucon: jaa Socrates: ha jol lattam te ugy gondolkodtal, hogy ha . matchel valamire, akkor \+ valamire lesz ervenyes, ugye? Glaucon: es sed abbol indul ki, aztan bekenhagyja a tobbi reszt ? Socrates: aszem igen. Socrates: ha jol ertelmezem amire gondolsz :) Socrates: \+ annyit kap el, ammennyit csak tud Socrates: minnel tobbet Glaucon: akkor a "*" az 0 vagy tobb ? Socrates: igen Socrates: akkor most jojjon meg egy pelda Socrates: A fart szora matchel-e a kov. regexp: f\+a*r.\+t* ? Glaucon: igen Socrates: akkor magyarazatot kernek :) Glaucon: okay Glaucon: szoval, jon az elso "f" amire matchel is a "\+", mivel van legalabb egy "f", azutan jon az "a", abbol lehet 0, 1, vagy tobb, van belole 1, tehat ez is jo, jon az r, az oke', azutan a "." az matchel a "t" -re, a "\+" is, mivel van egy "t" es azutan a "t*" is jo, mivel abbol 0 van, es lehet is belole 0 Glaucon: ez igaz lehet ? :) Socrates: pontosan! Glaucon: na, akkor kiraly! :) Socrates: csodas, akkor mehetunk tovabb? Glaucon: mehetunk :) Socrates: szal, kovetkezo lepes, amit tulajdonkeppen elobb kellett volna, de most jutott eszembe Socrates: ezek pedig a string elejet es veget jelzo speci karakterek: ^ es $ Glaucon: ja, ezeket nagyjabol tudom Socrates: ha ^ a regexp elejen all, akkor az azt jelenti, hogy a regexpnek a string legelejetol kezdve kell matchelnie Socrates: $ meg ugyanez a string vegire Glaucon: okay Socrates: erre mondjak peldat vagy ez megy? Glaucon: mondj inkabb Socrates: oke Socrates: adott a kedvenc foobar szovegem, matchel-e ra a ^bar$ regexp? Glaucon: igen Glaucon: ?!? Socrates: es miert? Glaucon: haaaattt.... Glaucon: ezt inkabb te magyarazd el ;) Socrates: a szovegnek bar-al kene kezdodnie Socrates: de foo-val kezdodik Socrates: igy a regexp nem matchel Glaucon: jaaa, akkor mar ertem is Glaucon: na ezt jo, hogy megegyszer elmondtad, igy mar vilagos Glaucon: meg egyet peldat lehetne ? Socrates: persze Socrates: legyen mondjuk a szoveg "looooooofasz windozer" Glaucon: oke' :) Socrates: matchel-e erre a loo*.*r$ regexp? Glaucon: igen Glaucon: "lo" az matchel, akkor tehat menjunk tovabb, adott meg egy o*, abbol a 0-as valtozat matchel, azutan a vegen van egy "r" , ez is igaz, mivel a regexp vegen talalhato is egy "r" betu Glaucon: tehat matchel Socrates: jahm Socrates: naszoval, a kovetkezo cuccos aminek nem tudom a nevet de [] koze rakjak oket Socrates: talan ugy lehetne leirni, mint karakter-class Glaucon: okay Socrates: a lenyeg a kovetkezo Socrates: ami [ es ] kozott van, azok kozul barmelyik matchelhet a szovegre Socrates: tehat mig . minden karaktarre matchel Socrates: [ es ] kozott meg tudod adni, hogy mely karakterekre matcheljen az adott "tomb" Socrates: asszem ezt peldan lehetne a legjobban szemeltetni.. Socrates: szal, adott a foo szoveg, es a kov. regexp: [aoede] Socrates: [aoede] azt jelenti, hogy ez az egesz cuccos ([aoede]) igy ahogy van matchelheto a o e d es e karakterekre Glaucon: ez eddig vilagos Socrates: akkor ez alapjan, matchel-e az [aoede] regexp foo -ra, es ha igen, annak mely reszere? Glaucon: hat az elso "o" -ra matchel Socrates: tokeletes Socrates: es [aoede]* mire matchelne foo-bol? Glaucon: mind a 2 "o" -ra Socrates: jahm Glaucon: :) Socrates: akkor menjunk is tovabb egy elitebb peldara, ok? Glaucon: ok Socrates: adott a "debian rulez" szoveg. matchel-e erre a "d[eiou]\+[blair]*.\+z$" regexp? Glaucon: szerintem igen :) Socrates: es miert? Glaucon: jon a d, az okes, azutan matchol abbol az "e" amit a \+ is bizonygat, majd a kovetkezobol matchel a b, amire a "*" is igaz, majd azutan a .\+ az mindent magaval huz, egeszen a vegeig, es a vege pedig z Socrates: nem teljesen Socrates: [blair]* Socrates: ez matchel b -re, i-re es a-ra is Socrates: mert akarhany olyan karakterre matchel ami b, l, a, i vagy r Socrates: szal bia -ra matchel Glaucon: ja, oke :) Glaucon: ertem mar... Socrates: akkor kovetkezo regexp jon Socrates: amint kitalalom persze Glaucon: okay :) Socrates: legyen a szoveg mondjuk "almafa diofa es ufffa" Socrates: a regexp pedig "^[am]\+[lmaf].*.a$" Socrates: matchel-e + indoklas Glaucon: matchel, mivel az elejen van egy "a", ami a [am]-re matchel, az azutan valo "\+" is igaz, mivel van belole egy, akkor az [lmaf]-bol csak az "l" matchel, azutan minden matchel a "." az az "f" es "a" betuvel vegzodik, ez is igaz Socrates: kivalo! Glaucon: koszonom :) Glaucon: hat ugynezki jo tanitom van :) Socrates: nagyon jo, es szepen el is van mondva Socrates: buszke vagyok ;) Glaucon: :)) Socrates: [] -nel egyvalamit kihagytam, sot, kettot Socrates: az egyik az un, rovidites Socrates: ha pl azt akarod irni, hogy [abcde] azt irhatod ugy, hogy [a-e] Socrates: azaz a-tol e-ig Socrates: ha azt akarod, hogy a-tol e-ig, es H-tol O-ig, akkor [a-eH-O] Socrates: akkor most jon a grouping, avagy csoportositas Glaucon: huha :) Socrates: erre is otoljek ki peldat? Glaucon: nem kell, vegulis ugyanaz. Socrates: okes, szerintem sem kell Socrates: akkor a masik ami kimaradt, az a "negalas" Socrates: amikor azt mondod, hogy barmire matchelhet, csak erre meg erre nem Socrates: pl azt akarod, hogy barmi lehessen csak w nem Socrates: ekkor aztat irod, hogy [^w] Glaucon: na ez is erdekel Glaucon: ez is vilagos Socrates: ha [ utan rogton ^ jon, akkor ami az utan van, arra nem matchel, minden masra viszont igen Socrates: azert erre en mondanek egy peldat, mert ezt konnyen el lehet nezni :) Glaucon: okay :) Socrates: ^ -nek rogton a [ utan kell alnia, hogy tagadas legyen Socrates: ha nem az elejen van, akkor nem tagadas, hanem egy "^" karakter Glaucon: es ha azt akarom, hogy legyen amire matcheljen is akkor azt kulon irom Glaucon: tehat [^wer][asd] Glaucon: w,e,r -en kivul asd-re matchelhet ? Glaucon: ez ertelmes ? Socrates: ertelmes, de maskepp ertelmezodik mint ahogy gondolod Glaucon: nahat... Socrates: [^wer] barmire matchel, csak w, e es r betukre nem Socrates: ezutan jon [asd], azaz vagy egy a, vagy egy s, vagy egy d Glaucon: ertem mar Socrates: tehat ket karakterbol kell allnia a szovegnek Socrates: hm most jutott eszembe megegy dolog amit elmondok grouping elott Glaucon: okay :) Socrates: legyen a szoveg "debian forever" Socrates: es a regexp pedig "^[a-z][^esdf]*.b[c-oa]\+" Socrates: matchel-e + indoklas, szokas szerint Socrates: (istenem de randa regexpekkel tudok elojonni :) Glaucon: :) Glaucon: nem matchel, az elso "[a-z]" imho matchel, ott van a d, aztan a masodik "[^esdf]" mar ki van zarva, mivel a masodik betu egy "e", innentol mar lottek neki Socrates: nem Socrates: mert [^esdf] utan van egy * azaz lehet belole 0 Glaucon: telleg ;] Socrates: figyelni kell am nagyon! Glaucon: matchel Socrates: akkor indoklas kell mar csak Glaucon: tehat amint mondtad abbol van 0, azutan a "." az jelenti akkor a masodik "e"-t, aztan jon a b, azutan az i meg az a matchel Socrates: majdnem Glaucon: :-\ Socrates: n -re is matchel debian-bol Socrates: [c-oa] miatt Socrates: [c-o -ban benne van i es n, a pedig az a onnan Socrates: a []-n beluli sorrend nem szamit Glaucon: igazad van, arra nem figyeltem Socrates: jo, akkor a kovetkezo reszen gyorsan atmegyunk Socrates: szerintem ez egyszeru lesz Socrates: nos, akkor a kovetkezo resz az alternativakrol szol Socrates: ezeknek a speci jele a \| Glaucon: okay Socrates: ez a \| arra jo, hogy kulonbozo alternativak kozul lehessen valasztani Glaucon: ok Socrates: tulajdonsaga, hogy hosszabb, egybefuggo blokkokat is lehet vele "alternativalni" Socrates: legjobban talan egy pelda szemlelteti a dolgot Glaucon: erre inkabb peldat :) Socrates: legyen a szoveg almafa Glaucon: legyen Socrates: a regexp pedig foo\|almafa Socrates: ez matchelni fog, mert azt kertuk, hogy vagy foo, vagy almafa -ra matcheljen Socrates: es almafa matchel Socrates: \| az .* -hoz hasonloan szeret minnel tobbet megenni Glaucon: hehe :) Socrates: tehat ha azt akarnam irni, hogy foo-ra vagy alma-ra matcheljen, es utana valami bar szoveg jojjon Socrates: akkor azt nem tudom ugy irni, hogy foo\|almabar Socrates: mert akkor foo-ra, vagy almabar -ra matchel Glaucon: hmmm, ertheto Socrates: ez ertheto eddig? Socrates: ok Socrates: megoldani a problemat ketfelekeppen lehet Socrates: az egyik az, hogy: foobar\|almabar Socrates: de ez randa, es bar ketszer szerepel benne Socrates: azzal "formalizalni", sed-nyelvre lehet ultetni ama mondatot, hogy: Socrates: "azt akarom, hogy matcheljen foo-ra, vagy alma-ra. Ha ez megvan, akkor a matchelt szovegreszletet kovesse bar" Socrates: akkor egy utolso pelda \| -ra mehet? Glaucon: mehet Socrates: adott a "Debian" szoveg Glaucon: oke' Socrates: matchel-e ra a "^[A-Za-z]*\|Debi$" regexp? Glaucon: matchel :) Glaucon: a ketto kozul az elso matchel Socrates: okes Socrates: eszrevetted hogy van egy beugratasi lehetoseg a regexpben? Glaucon: beugratasi ? Socrates: aham a $ Glaucon: hmmm... Socrates: lehetne ugy ertelmezni, hogy: vagy ^[A-Za-z]*, vagy pedig Debi$ Socrates: azaz vagy barmilyen abc-beli karakter Socrates: naszoval, grouping Socrates: ennek a dolognak az a lenyege, hogy regexp-csoportokat tudunk alkotni, amikre kesobb tudunk hivatkozni Glaucon: okay. Socrates: valamint a mindent-felfalni akaro operatorokat (pl \|) be tudjuk limitalni Socrates: tulajdonkeppen ugy kell tekinteni egy regexp-csoportot, mintha egyetlen egy kifejezes lenne, amit nem lehet reszekre bontani. Mintha egy betu lenne Socrates: ilyesmit csinal sed is Glaucon: ertem Socrates: ennek a groupingnak a magikus karakterei a \( es a \) Socrates: ami e ketto koze kerul, az a regexp-csoport Glaucon: itt is kell a "\" ? Socrates: kell ja Socrates: emiatt sokszor el is lehet szurni, ha az ember elfelejti a \ -t kitenni :( Glaucon: feljegyzem ;) Socrates: szerintem ezt megint peldaval lehetne a legjobban illusztralni Socrates: talaltam is egy aranyosat, ami tok jol bemutatja: Socrates: adott az \(ab\|cd\)x regexp Socrates: szerinted ez mire fog illeszkedni? Glaucon: nem tudom :) Socrates: probald kitalalni... Glaucon: ab es cd -re ? Socrates: tipp: mire illeszkedne ab\|cd ? Glaucon: ab vagy cd -re Socrates: igen Socrates: es \(ab\|cd\) mire fog matchelni? Glaucon: hmmmm.... Glaucon: ab vagy cd-re ? :) Socrates: pontosan Socrates: tehat akkor \(ab\|cd\)x mire fog? Glaucon: abx vagy cdx -re Socrates: igy van Glaucon: ez nem volt nehez :) Socrates: sed igy gondolkodik valahogy: Socrates: \(ab\|cd\) ez matchel ab vagy cd-re. ez utan a csoport utan jon egy x. Azaz az egesz matchelni fog ab-re vagy cd-re, ha utanuk x jon, azaz abx-re vagy cdx-re Socrates: mi a kulonbseg \(ab\|cd\)x es ab\|cdx kozott? Glaucon: hat hogy az elso mindenfelekeppen fog matchelni vmelyikre, lehet akar abx vagy cdx, a masodik meg vagy ab -re vagy cdx -re Socrates: helyes Glaucon: okay ;-) Socrates: akkor vegyunk egy masik peldat, hogy lassuk kell-e meg valamit magyaraznom rajta, vagy tiszta a dolog Socrates: legyen a regexp "^\([a-e]\+\|c)\|\(foo\)*" Socrates: matchel-e ez az "echo" stringre? Glaucon: termeszetesen ! Glaucon: megpedig Glaucon: ugye az elso betuvel kell kezdodnie Socrates: eddig ok Glaucon: a ket csoportbol ugye az elso matchel ra, [a-e]\+ ebbe benne van az "e" es legalabb egyszer benne is van, a foo meg nem matchel ra, es azutan pedig a ket csoport utan van egy *,tehat ez azt jelenti, hogy mindegy mi van elotte Socrates: es ha nem lenne * a vegen? Glaucon: akkor nem matchelne Socrates: miert? Socrates: szal az a konkluzio hogy * nelkul is matchel? Socrates: igen/nem valaszt ha lehet :) Glaucon: hmmm... Socrates: najo, akkor elmondom Glaucon: most a "matchel" azt jelenti, hogy az egeszre matcheljen, vag a toredekre is ? Socrates: tordekere is Glaucon: akkor matchel Socrates: egeszre akkor kell matchelni ha ^ -vel kezdodik es $-re vegzodik a regexp Socrates: ok Socrates: akkor megegy uccso, rendben? Glaucon: persze, johet Socrates: es utana raterunk hogy hogyan lehet ezt a groupolast maskepp is hasznalni Glaucon: okay Socrates: legyen a regexp "\([aeiou]\+foo\)*ba[^r]*" matchel-e a barbie szora? Glaucon: matchel :) Socrates: melyik reszere es miert? Glaucon: hat mivel a csoportra nem matchel, az mindegy, mivel utana van egy "*", azutan a masodikra sem matchel, mivel ott van a "^r", viszont ezutan is van csillag, szoval matchel ;-) Socrates: es melyik reszere matchel a stringnek? Glaucon: hogy hogy melyik reszre ? :) Socrates: a regexp melyik reszet fedi le a barbie szonak teljesen? Glaucon: "ba" -t Socrates: helyes Socrates: nagyon jo! nagyon jo! Glaucon: :)) Socrates: mar tok randa regexpeket is megertesz! ugye hogy nem nehez? Glaucon: hat tenyleg nem :) Socrates: akkor most jon az utolso reszek egyike, a regexp masik oldala Glaucon: okay. Socrates: az a resz, amire le akarod cserelni a cuccost Socrates: ez rem egyszeru lesz, mert it tulajdonkeppen ket dolgot kell tudni: ez egyik a & Socrates: ebben az a lenyeg, hogy a & karakter viszi magaval azt, ami matchel, tehat ha adott egy foobar szoveg es egy f.\+b regexp, akkor &-nek foo lesz az erteke, ez vilagos ? Glaucon: igen Socrates: szerintem ez menni fog, lepjunk tovabb a meg fennmarado temara Glaucon: ok Socrates: ez pedig a \1, \2, \3 esatobbi Socrates: ez a groupinggal van osszefuggesben Socrates: ezeket szinten a masodik feleben lehet hasznalni a sed kifejezesnek, a kovetkezokeppen: Socrates: amikor egy csoportot hatarozol meg \( es \) segitsegevel, akkor a masodik felben erre egy \X -el lehet hivatkozni, ahol X a \(\) csoport szama Socrates: szoval ha van ket \(...\) kifejezesed, akkor az elso lesz \1, a masodik \2 Glaucon: okay Socrates: fontos, hogy ha az elso \(...\) ures, akkor a masodik NEM lesz automatikusan \1, hanem \1 ures lesz Socrates: azaz az egyes \(...\)-k es a \X -ek kozott egyertelmu megfeleltetes all fent Glaucon: ha jol ertelmezem ezt Glaucon: akkor _minden_ csoportra ad szamot, attol fuggetlenul, ha abban a csoportban nincs is semmi !? Socrates: igy van Glaucon: okay Glaucon: es azzal micsinal ? Glaucon: csak siman atadja ? Socrates: szal, ha van egy ilyened, hogy \(\)\(fo\), es ezt "futtatod" a foo stringen Socrates: akkor \1 ures lesz, \2 pedig fo Socrates: amire \(\)\(fo\) matcheld (fo) a helyere \1 -t teszi be, azaz semmit Socrates: es megmarad az o, ezert jon ki elsore az Socrates: probald ki Socrates: masodikban \2 = fo, tehat fo-t lecsereled fo-ra, es marad a vegen az o, amirol a regexp nem szolt Glaucon: na, ezt nem ertem Socrates: pedig ecceru. nezzuk meg reszletesen hogy gondolkodik sed Glaucon: ok. Socrates: adott a foo string Socrates: eloszor lat egy olyat a sed, hogy \(\), ez matchel a nagy semmire, nem sok vizet zavar, sed ignoralja Socrates: viszont, mivel csoportrol van szo, automatice \1 -hez hozzakoti Socrates: es mivel \(\) a semmire matchelt, \1 is a semmi lesz Socrates: ez idaig kovetheto? Glaucon: igen Socrates: akkor megyunk tovabb! Socrates: sed lat egy olyat, hogy \(fo\) Socrates: ez nyilvan matchel foo -nak a fo reszere Glaucon: igen Socrates: mivel ez is group, ezert \2 -be bekerul az, amire ez a group matchelt, azaz fo Socrates: idaig meg mindig ok? Glaucon: persze Socrates: akkor most atterunk a regexp masodik reszere Socrates: a lecsereles kovetkezokeppen megy: Socrates: csak azt csereljuk le, amire a regexp matchelt Socrates: szoval, sed CSAK azt csereli le, amire a regexp matchelt. Csak azt a resz-szoveget Socrates: mivel a regexpunk fo-ra matchelt, csak fo-t csereli le, a maradekot beken hagyja, nem nyul hozza Socrates: ezert a kovetkezot csinalja: Socrates: kinyirja a stringbol azt, amire matchelt a regexp Socrates: ezesetben fo -t Socrates: es beteszi a helyere azt, amit megadtal, \1 -et, ami ures Socrates: tehat effektive fo-t kinyirta, es nem tett semmit a helyere Socrates: ezutan kiirja azt, ami maradt Socrates: jelen esetben o -t Glaucon: hmm, ertem mar Socrates: okes, akkor mondok egy peldat Socrates: adott a "^\([foo]*\) \(rulez\)$" regexp, valamint a "rulez" string. Ha csinalok egy olyat, hogy sed -e "s,^\([foo]*\) \(rulez\)$,Debian \1\2,", akkor mi lesz az eredmeny, es miert? Socrates: ize, a string legyen " rulez" Glaucon: a -e opcio mire jo ? Socrates: execute Socrates: -e azt jelenti, hogy ertelmezze az utana megadott sed-scriptet/kifejezest Socrates: ugyanazt csinalja mintha -e nem lenne, mert -e a default mukodesi mod Socrates: btw, man sed :) Socrates: ha kenyelmesebb ugy, akkor felejtsd el hogy van ott -e Glaucon: Debian es a $string -et adja vissza Glaucon: tehat Glaucon: "Debian $string" Glaucon: ebben az esetben Debian rulez, ami igaz is ! Socrates: pontosan Glaucon: kiraly :) Socrates: akkor asszem ezzel sed-nek a leggyakrabban hasznalt dolgait be is fejeztuk Glaucon: okay Glaucon: koszi, ez tenyleg segitett.
