regular expression howto magyarul

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.

Related posts

1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 5 out of 5)
Loading ... Loading ...

Comments are closed.

Zahnarzt Ungarn, Zahnbehandlung Ungarn : Zahnimplantat Ungarn, Zahnimplantate Ungarn : Zahnersatz Ungarn