Regular Expressions Zoran Delajlija Aco Dmitrovi 1 Drugovi
- Slides: 89
Regular Expressions Zoran Dželajlija & Aco Dmitrović 1
Drugovi Dinko Korunić v Željko Boroš v Zdenko Škiljan v Unix Guru Universe v © kreator © Želja © Zduke © UGU 2
Sadržaj v Uvod v Osnovna sintaksa v Alati v Problemi iz stvarnog života 3
Ab ovo v v Nastali 50 -tih god. kao formalno sredstvo za opis sintakse programskih jezika (Computer Science) Regularni izraz (RI) je mogao biti: w jedan znak w prazni string, ε w Spajanje dva regularna izraza • RI 1 RI 2 – tj. RI 1 za kojim slijedi RI 2 w Unija dva regularna izraza • Ri 1 | RI 2 – RI 1 ili RI 2 w Kleenova zvijeda, * • RI* - 0 ili više ponavljanja prethodnog RI 4
Ab ovo v Prva implementacija je u izvornom editoru teksta na Unixu - ed Kasnije u mnogim alatima: grep, sed, find itd. w u jezicima perl, python, Java, . Net, Java. Script… w programima: vi w 5
Prijevod v Doslovno: Pravilni izrazi v FER: Pravilni izrazi su širi pojam v Regularni izrazi su podskup pravilnih izraza v Skraćeno: regex, PI, RI… 6
Seminar v Čime se nećemo baviti? w Poviješću i teorijom • dovoljni su linkovi v Čime ćemo se baviti? w Što su RI i kako vam mogu olakšati život w ‘Cause being admin is hard enough 7
Izvori v Na Linuxu, priručno: $ man 7 regex $ perldoc perlop $ perldoc perlre 8
Pomoć na Mreži v Regular Expressions Tester: http: //www. forta. com/books/0672325667/ v Biblioteka regularnih izraza, s testerom http: //www. regexlib. com 9
Praksa Imate problem? Npr. ne znate koliko je programskih paketa instalirano na poslužitelju? v Može li se brzo riješiti uz pomoć RI? $ dpkg -l | grep -c ‘^ii’ Koliko je paketa instalirano, ali nije konfigurirano? $ dpkg -l | grep ‘^i’ | grep -v -c ‘^ii’ $ dpkg -l | grep ‘^i[^i]’ v Koliko je paketa deinstalirano, ali je konfiguracija još tu? $ dpkg -l | grep -c ‘^r’ v 10
Regularni izrazi v Definicija: “predložak koji služi za označavanje ili odabir određenog niza znakova unutar većeg teksta” v Zapis u obliku niza znakova (string) v Specijaliziran jezik, s vlastitom sintaksom i naredbama 11
Čemu služe RI? v Za sparivanje i obradu teksta (match & manipulate) v Osnovne mogućnosti w Pretraživanje teksta • u datotekama • standard input • u nekom nizu unutar programskog jezika w Zamjena (search & replace) 12
Gdje nabaviti RI? v Regularni izrazi nisu samostojeći alat koji možete kupiti ili skinuti s Interneta v Skup pravila ugrađenih u raznolik softver: programske jezike w alate w razvojna okruženja w 13
Vrste RI a) osnovni (basic regular expressions) – mogućnosti slične izvornim RI sed, grep na Unixu b) prošireni (extended regular expressions) – podizrazi, dodaci za ponavljanje i izbor grep –E, većina alata i jezika c) dodatna proširenja, npr. Perl RI Perl, PCRE library, Python sre modul… 14
grep General Regular Expression Printer v Global Regular Expression Parser v v Unix alat za pretraživanje teksta po datotekama ili na standardnom ulazu (stdin) v Osnovna namjena je prikaz redaka koji odgovaraju navedenom RI: $ ps -fe | grep sendmail 15
Otkud ime grep? Wikipedia: v Naredba za ed, povijesno standardni uređivač teksta na Unixu: g/re/p v “traži globalno retke koji se podudaraju sa regularnim izrazom re i ispiši ih" v 16
sed v Stream EDitor v samo osnovni regularni izrazi v Jednoslovne naredbe kao u povijesnom standardnom editoru na Unixu “ed” v Tipična primjena u unix ljusci je pipe: $ nekakav_ulaz | sed ’s/nesto drugo/’ v http: //sed. sf. net/ 17
awk v Pravi programski jezik, sa varijablama i složenom sintaksom. v Extended RE v Ugrađeno dijeljenje ulaznih podataka po stupcima. v Tipični oneliner: $ route -n | awk ’{print $2}’ 18
perl v Kompleksni skriptni jezik proceduralno ili objektno programiranje - mnoštvo ugrađenih tipova podataka (liste, nizovi, asocijativne tablice (hash), reference. . . ) - sintaksa za RI ugrađena u jezik, poznati konstrukti iz seda i awka, npr. /foo/ ili s/trazi/zamijeni/ - perldoc perlop, perldoc perlre - v s/^/> / if (/^$/. . eof()); # quote body 19
Raznolikost Način korištenja se razlikuje od alata do alata v Različite mogućnosti, ovisno o vrsti i konkretnoj implementaciji v Moguće suptilne (dijalektalne) razlike v npr. : mawk (Debian default), GNU awk i Solaris awk imaju različite mogućnosti. w Svi oni se pak razlikuju od sed-a, GNU grepa ili sistemskog grepa na nekom Unixu. w Linux instalacije imaju GNU alate sa dodanim mogućnostima – oprez ako kod treba biti portabilan! w 20
Raznolikost v Većina problema ima više ispravnih rješenja Neka su brža w Druga jednostavnija w Neka su prenosiva i rade na različitim varijantama alata, ili u drugim alatima. w Kao i za sve na Unixu, potrebno je istražiti stvarne mogućnosti – ništa bez RTFM i samostalnog isprobavanja. v Vježba, vježba… v 21
Uzorak i sparivanje v Regularni izraz definira uzorak, koji se uparuje s tekstom (pattern & match) v RI: ri w regularni izraz koji se sastoji od pojave regularnog izraza i neposredno iza izraza r v Tekst: Riba ribi grize rep. 22
sparivanje v v r i – izrazi koji se podudaraju sa doslovnim znakom ri – složeni regularni izraz w v Spojeni regularni izraz se podudara ako se svaki jednostavni RI redom podudara sa uzastopnim dijelovima niza. Označeni podnizovi se podudaraju sa izrazom ri: Riba ribi grize rep. Unix razlikuje mala i velika slova (case sensitive), regex također w Opcija i isključuje razlikovanje (case insensitive) w Traženje RI sastavljenog od doslovnih znakova: $ grep –i lignjun recepti. txt $ awk ’/lignjun/i’ recepti. txt v 23
Koliko pogodaka? v Većina alata podrazumijevano barata samo s prvim pogodkom v Prekidač g (global) vraća niz koji sadrži sve pogotke iz pojedinog retka odn. niza grep je pretpostavljeno globalan w sed, perl: /RI/g, s/RI/zamjena/g, vi: g/RI/, s/RI/zamjena/g w 24
Primjer $ ls -1 01 Tubular Bells Part One. mp 3 02 Tubular Bells Part Two. mp 3 $ ls -1 | sed ’s/ /_/’ 01_Tubular Bells Part One. mp 3 02_Tubular Bells Part Two. mp 3 $ ls -1 | sed ’s/ /_/g’ 01_Tubular_Bells_Part_One. mp 3 02_Tubular_Bells_Part_Two. mp 3 25
Proizvoljni znak –. RI. (točka) zamjenjuje bilo koji, ali točno jedan znak v grep ispisuje cijeli redak u kojem je nađen traženi uzorak v $ grep lignj. recepti. txt sta kupujes. Lignja je skupa, lignjun je jeftin pa tom smijesom napuni lignje. Kad si ih napunio ako ne nema vez uli malo ulja i prepeci lignje 26
Citiranje – metaznak Što ako tražimo upravo znak ”. ” (točku)? v dodan ispred, mijenja značenje metaznaka u običan znak (engl. escape) v Na primjer: v w Regex a. xls se podudara sa: naplata. xls w Regex. a. xls se podudara sa: naplata. xls v Znak koji ima drugo značenje od doslovnog nazivamo metaznak. 27
Podudaranje: grep $ grep lignj. recepti. txt sta kupujes. Lignja je skupa, lignjun je jeftin pa tom smijesom napuni lignje. Kad si ih napunio ako ne nema vez uli malo ulja i prepeci lignje v grep zapravno ne podcrtava, kako znati što je zapravo upareno? 28
Podudaranje: grep -o v Opcija –o vraća upravo niz koji se podudario $ grep –o lignj. recepti. txt lignju lignje $ echo ”Riba ribi grize rep. ” | grep –o ri ri ri $ echo ”Riba ribi grize rep. ” | grep –io ri Ri ri ri 29
Alati: grep v Osnovna uporaba: datoteka ili pipe (stdin) $ ls -1 /etc/apache/conf. d > popis $ grep php popis php 4. conf phpmyadmin. conf. dpkg-old phpmyadmin. conf. dpkg-tmp # ili $ ls -1 /etc/apache/conf. d | grep php 4. conf phpmyadmin. conf. dpkg-old phpmyadmin. conf. dpkg-tmp 30
Alati: grep v v grep – osnovni regularni izrazi (grep -G) – pretpostavljeno ponašanje egrep – prošireni regularni izrazi (grep -E) grep -P – kompatibilnost sa Perlovim RI (nije uobičajeno!) Za bilo kakve složenije izraze koristi se egrep 31
Digresija – problemi sa shellom $ ls dopis. txt. gpg v Hoće li regex: . . . pronaći datoteku s nazivom dopis. txt. gpg? Teoretski, ne bi trebao, ali… $ ls | grep. . . dopis. txt. gpg 32
Problemi sa shellom U čemu je greška? Unix shell interpretira znakove , *, ? , [, ], $ koji se koriste i u RI v Regularni izraz treba staviti u navodnike: $ ls | grep '. . ' (ne nalazi ništa, kao što je i očekivano. ) $ ls | grep '. . ' dopis. txt. gpg v 33
Početak retka: ^ v Regex: . u. $ grep. u. popis burek. dpkg-old squirrelmail. conf w v v Provjerite sa grep -o! Regex: ^. u. ^ se podudara sa praznim nizom na početku retka $ grep ^. u. popis burek. dpkg-old Ne podudara se: squirrelmail. conf 34
Metaznakovi ^ i $ v v Kraj retka: $ Analogno, $ uparuje prazan niz na kraju retka $ grep conf$ popis nothing. conf php 4. conf phpmyadmin. conf squirrelmail. conf ssl. conf 35
^ i $ primjer $ grep 'n. *' popis nothing. conf php 4. conf phpmyadmin. conf. dpkg-old phpmyadmin. conf. dpkg-tmp squirrelmail. conf ssl. conf Na sve primjere za grep probajte dodati i -o opciju! $ grep '^n. *' popis nothing. conf $ grep '. conf$' popis Pazi na točku! nothing. conf php 4. conf phpmyadmin. conf squirrelmail. conf ssl. conf 36
Metaznakovi ^ i $ v Korisni i sami za sebe: ^ - mjesto početka retka w $ - mjesto kraja retka w ^$ - zajedno, poklapaju se samo za prazan redak! w v Izbaciti sve prazne retke iz datoteke w grep –v '^$' infile 37
klase [] [abc] znači: na ovom mjestu smije biti znak a, ili b, ili c v [Aa]. znači: veliko ili malo a, zatim još jedan znak v [a-z] znači: bilo koje malo englesko slovo v [a-z. A-Z-] znači: bilo koje malo ili veliko slovo ili crtica v [Rr]eg[3 Ee]x se podudara sa “regex”, “Reg 3 x”, “reg. Ex”… v 38
klase: primjeri $ grep '[kgh]' popis burek. dpkg-old nothing. conf php 4. conf phpmyadmin. conf. dpkg-old phpmyadmin. conf. dpkg-tmp $ grep '[A-Z]' popis DEADJOE $ grep '[. ]old' popis isto kao '. old' $ 39
klase – postojeće kratice znači: bilo koja znamenka, 0 do 9 v kratice za uobičajene [] podizraze v [0 -9] d – isto kao [0 -9] (“Digit”) w w – [a-z. A-Z 0 -9. ] (“Word character”) w • točno značenje ovisi o konkretnom alatu i o lokalizaciji w s – praznina (“Space”) – razmak, tab, novi red (i još neki) v Točka je unutar klase doslovna 40
Inverzija klase [^. . . ] – bilo koji znak, osim “X” v [^0 -9 a-f. A-F] – bilo koji znak osim hex. znamenki v D – bilo koji znak osim znamenki v W – bilo koji znak osim slova i brojki v S – podudara se sve osim razmaka v Primijetite različito značenje za ^ v [^X] 41
klase: primjeri $ grep php popis php 4. conf phpmyadmin. conf. dpkg-old phpmyadmin. conf. dpkg-tmp $ grep 'php[^4]' popis phpmyadmin. conf. dpkg-old phpmyadmin. conf. dpkg-tmp bi li "index. php" prošao? $ echo Proba | grep '[A-Z]' Proba $ echo Proba | grep '[^A-Z]' Proba 42
Ponavljanje jedan, neobavezni, znak A (doslovno, 0 ili 1 ponavljanje izraza A) v [0 -9]* nijedna, jedna ili više znamenki v [0 -9]+ jedna ili više znamenki v A? 43
Građenje izraza s ponavljanjem Tražimo datoteke sa dvije "ekstenzije" $ ls | grep '. . . . ' npp. 3. 2. Installer. exe passwds. txt. gpg plazma-0. 0. 6 -1. i 586. rpm politika. txt. orig skype_1. 2. 0. 18 -1_i 386. deb grep -o! tahoma-regular-12. bdf. BAK $ ls | grep '. . . . $' passwds. txt. gpg tahoma-regular-12. bdf. BAK . . . a ostalo? v 44
Građenje izraza $ ls | grep '. . *$' npp. 3. 2. Installer. exe passwds. txt. gpg perl_5. 8. 0 -3_incr. diff plazma-0. 0. 6 -1. i 586. rpm politika. txt. orig pomet. skey. test postits. tar. gz silo. conf. bak silo. conf. old skype_1. 2. 0. 18 -1_i 386. deb squirrelmail-change-pass-cn_2. 6 -1_all. deb tahoma-regular-12. bdf. BAK 45
Građenje izraza $ ls | grep '. [^. ]*$' više nije bilo koji znak npp. 3. 2. Installer. exe passwds. txt. gpg perl_5. 8. 0 -3_incr. diff plazma-0. 0. 6 -1. i 586. rpm politika. txt. orig pomet. skey. test postits. tar. gz silo. conf. bak silo. conf. old skype_1. 2. 0. 18 -1_i 386. deb squirrelmail-change-pass-cn_2. 6 -1_all. deb tahoma-regular-12. bdf. BAK 46
Ponavljanje – {n} v v Vitičaste zagrade: broj unutar zagrade znači broj ponavljanja prethodnog znaka/izraza A{n} – uparuje se sa točno n ponavljanja izraza A A{n, } – barem n ponavljanja izraza A A{n, m} – između n i m ponavljanja 47
Ponavljanje – {n} v v v A{3} – "AAA" w{3} – 3 slova ili znamenke [0 -9 -]{6, } – barem 6 znamenki, razmaka ili crtica w lokalni telefonski broj [0 -9]{13} naivna provjera ispravnosti JMBG-a w Kako je poboljšati? [0 -9]{1, 4} – jedna do četiri znamenke 48
Ponavljanja: primjer $ grep 'php 4? ' popis php 4. conf phpmyadmin. conf. dpkg-old phpmyadmin. conf. dpkg-tmp $ grep -o 'b*' popis b $ grep -o 'b. +' popis burek. dpkg-old # svi telefonski brojevi korisnika $ egrep –o '[[: digit: ]]{6, 10}' /etc/freeradradiusd. log 22341461 12887513 12815334 2884968 01234567890 2884968 [. . . ] 49
grep -o zadatak v Iz /var/log/mail. log izvući mail adrese nepostojećih lokalnih primatelja grep –o za ispis samo bitnih nizova w Uputa: ponekad treba više od jedne naredbe u pipe-u w Uputa 2: obrisati nepoželjne znakove sa tr –d w v Primjer sendmail loga: http: //regex. ifzg. hr/primjeri/mail. log 50
grep -o zadatak v v Iz /var/log/mail. log izvući mail adrese nepostojećih lokalnih primatelja Moguće rješenje: $ grep 'User unknown' /var/log/mail. log | grep -o '<. *>' | tr –d '<>' ndrie@ozgf. hr moilne@zogf. hr ndrie@ozgf. hr jommy@zolost. zogf. hr moilne@zogf. hr ime_lacoc@nit. hr, ctladdr=senje@ozfg. hr v Što sa viškom iz zadnjeg retka? 51
Greediness v Metaznakovi *, +, i {n, } uvijek pokušavaju pokupiti najdulji mogući niz, "pohlepni" su. grep 'User unknown' /var/log/mail. log | grep '<. *>' [. . . ] Feb 14 09: 55 filist sm-mta[23447]: k 1 E 8 akei 024081: to=<ime_lacoc@nit. hr>, ctladdr=<senje@ozgf. hr> (268/100 [. . . ] v Izbjeći. * konstrukciju? grep 'User unknown' /var/log/mail. log | egrep '<[^>]*>' sve osim ">" [. . . ] Feb 14 09: 55 filist sm-mta[23447]: k 1 E 8 akei 024081: to=<ime_lacoc@nit. hr>, ctladdr=<senje@ozgf. hr> (268/100 v . . . ali grep uvijek vraća sve pogotke u retku! 52
Greediness v Precizniji izraz? grep 'User unknown' /var/log/mail. log | egrep –o 'to=<[^>]*>' | tr –d '<>' | sed 's/to=//' [. . . ] ime_lacoc@nit. hr grep 'User unknown' /var/log/mail. log | egrep –o ' <[^>]*>' | tr –d '<>' 53
Laziness v v Perl, python, itd. imaju ? modifikator dodan nakon *, + mijenja ponašanje iz "pohlepnosti" u "lijenost" grep 'User unknown' /var/log/mail. log | perl –ne 'print $1. "n" if /<(. *)>/' [. . . ] grep 'User unknown' /var/log/mail. log | perl –ne 'print $1. "n" if /<(. *? )>/' [. . . ] 54
Unija, | v| daje “ili” (OR), alternativni uzorak v Mr|Miss|Mrs Niz se podudara sa kombiniranim izrazom ako se podudara sa bar jednim od izraza w Prednost ima lijevi izraz w • Neke implementacije uvijek nalaze najdulji izraz! Ovome ćemo se vratiti kasnije. . . v Ovo w je “extended” regular expression Za sed i grep | ("štanga") je običan znak! v (Mr|Miss|Mrs) 55
Podizrazi v (nad|pod)naslov w podudara se sa “nadnaslov” ili “podnaslov” v (burek)* • npr. burek, burekburek, ili ništa! v /^(w+)$/ • redak koji sadrži samo alfanumerike i točku. 56
Podizrazi i reference v v v s/(Language. Priority)s+(. *)/1 hr 2/ 1, 2, . . . su reference sed: 1, 2, 3. . . perl: $1, $2, $3. . . w ostaju definirane i kasnije u programu /(. . )1/ - cous, 4242, 9 nu, . . . /('''). *1/i – '''niz uokviren sa tri navodnika''' 57
Grupiranje i reference v Automatizacija izmjena u konfiguraciji Apache servera na 200 ustanova. Primjer: staro: Language. Priority en nl et fr de it novo: Language. Priority hr en nl et fr de it v s/(Language. Priority)s+(. *)/1 hr 2/ (RI) – podizraz w 1 – niz koji se podudario sa prvim zagradama w 2 – niz koji se podudario sa drugim podizrazom, ma kakav bio w 58
Rezime: metaznakovi v Osnovni RI w ^. $ [] () sed, grep početak retka bilo koji znak kraj retka klase znakova [a-z] grupiranje (A) citiranje narednog metaznaka v Prošireni RI w ^. $ | () [] grep -E, ostali alati početak retka bilo koji znak kraj retka alternative A|B grupiranje (A) klase znakova [a-z] citiranje narednog metaznaka . , \ 59
Rezime: metaznakovi v Osnovni RI w sed, grep * 0 ili više ponavljanja prethodnog znaka/izraza v Prošireni RI w grep -E, ostali alati ? 0 ili 1 * 0 ili više + 1 ili više {n} točno n ponavljanja {n, } n ili više {n, m} između n i m ponavljanja 60
Rezime: provjera mjesta v v v Graničnici b mjesto ruba riječi (početak ili kraj) B mjesto unutar riječi < početak riječi > kraj riječi Lookahead / lookbehind (? =izraz) na ovom mjestu u tekstu se nalazi izraz (? !izraz) na ovoj poziciji ne smije biti izraz (? <=izraz) ispred ove pozicije se nalazi izraz (? <!izraz) na ovoj poziciji u tekstu slijedi izraz Lookaround ne "jede" znakove u tekstu 61
Rezime: klase v v v d D w W s S znamenka sve osim znamenke slova+znamke+tocka sve osim znakova iz W razmak, tab, novi red sve osim praznina Ostale kratice v t tab v n line-feed w unix novi red v r carriage-return w rn – DOS novi red v a bell POSIX klase (GNU grep) v [: alpha: ] slovo v [: digit: ] znamenke v [: alnum: ] slova i znamenke v [: blank: ] razmak, tab v [: space: ] blank+novi red v [: cntrl: ] kontrolni znakovi v [: graph: ] vidljivi znak. . . v [: print: ]. . . uključujući razmak v [: punct: ]. . . koji nije slovo, znamenka ili razmak v [: lower: ], [: upper: ] v [: xdigit: ] egrep ’^[[: upper: ]]+$’ popis 62
Alati: sed Sintaksa za baratanje retkom teksta u sedu: w s/traži/zamijeni/ - search/replace u trenutnom retku w y/ABCD/abcd/ - zamijenjuje znakove s lijeve strane onima s desne (slično kao naredba tr) w d - efektivno, brisanje retka v Regularni izrazi se označavaju sa /. . . / ili sa X. . . X, pri čemu X može biti bilo koji znak v 63
Alati: sed Ispred sed naredbe može biti uvjet (“adresa”). Formalno: [adresa[, adresa]] naredba [argumenti] - Doslovno, zamijeni početak retka sa #. Zakomentira svaki redak sa znakom #. v 0 s/^/#/ - zakomentiraj samo prvi redak v 0!s/^/#/- zakomentiraj sve osim prvog retka v /[0 -9]/!s/^/#/ - komentira retke koji ne sadrže znamenke “; ” odvaja naredbe u istom retku, npr. v s/^[ t]*//; s/[ t]*$/ v s/^/#/ 64
sed: s/// v s/RI/zamjena/ zamjenjuje prvu pojavu RI drugim w sed, vim, perl (awk: gsub) w v v v s/foo/bar/ s/^/> / dodaje quote “> “ na početak retka Modifikatori: w s/foo/bar/g zamjenjuje svaki “foo” sa “bar”, ne samo prvi u nizu w s/foo/bar/i Mijenja FOO, foo i Fo. O w s/foo/bar/gi 65
sed: s/// primjer $ grep '^b' popis burek. dpkg-old $ grep '^b' popis | sed 's/. dpkg-. . . //' zamijeni “ničim” burek $ grep '^b' popis | sed 's/. . *$//' burek $ grep '^b' popis | sed 's/$/. bak/' burek. dpkg-old. bak $ grep '^b' popis | sed 's/. . *$/. bak/' burek. bak 66
sed: s/// primjer $ cd /etc/apache/conf. d $ ls -1 | grep –v '. conf' DEADJOE burek. dpkg-old $ ls -1 | grep –v '. conf$' $ grep '^b' popis | sed 's/. dpkg-. . . //' zamijeni “ničim” burek $ grep '^b' popis | sed 's/. . *$//' burek $ grep '^b' popis | sed 's/$/. /' burek. dpkg-old. bak $ grep '^b' popis | sed 's/. . *$/. bak/' burek. bak 67
Pitanja? 68
Podizrazi i reference v v v s/(Language. Priority)s+(. *)/1 hr 2/ 1, 2, . . . su reference sed: 1, 2, 3. . . perl: $1, $2, $3. . . w ostaju definirane i kasnije u programu /(. . )1/ - cous, 4242, 9 nu, . . . /('''). *1/i – '''niz uokviren sa tri navodnika''' 69
Podizrazi i reference v Primjer: automatizacija izmjena u konfiguraciji Apache servera na 200 ustanova. staro: Language. Priority en nl et fr de it novo: Language. Priority hr en nl et fr de it v s/(Language. Priority)s+(. *)/1 hr 2/ (RI) – podizraz w 1 – niz koji se podudario sa prvim zagradama w 2 – niz koji se podudario sa drugim podizrazom, ma kakav bio w 70
Podizrazi i reference v _(. . . )? – opcionalni podizraz w ? – 0 ili 1 pojava 71
zadatak: sed v U /etc/apache/httpd. conf datoteci zamijenite sve Add. Type retke za. php i slične php ekstenzije sa Add. Handler redcima. Add. Type application/x-httpd-php. php Add. Type application/x-httpd-php-source. phps v Dodatno, koristeći reference ostavite zakomentirani originalni redak iznad izmijenjenog. 72
zadatak: sed v v v Diskusija Na koje ste probleme naišli? Kako drugačije riješiti? 73
Alati: awk Osnovna sintaksa: [uzorak] { naredba; naredba } [uzorak 2] { blok naredbi 2 } (ako je ispunjen uvjet iz uzorka, izvrši blok) v Posebni uvjeti: BEGIN {} – na početku izvršavanja END {} – na kraju ulazne datoteke, ili uz poziv exit v BEGIN {m=120; j=0; } /mp 3$/ {m++; if (m >= 500) {exit; }} /(jpg|jpeg)$/ {j++; } END {print "mp 3 ca: " m " jpegova: " j} v 74
Alati: awk v v Regularni izraz se ograđuje sa /. . . / Ugrađeno dijeljenje retka po stupcima $0 – varijabla koja sadrži cijeli redak w $1, $2, $3 – prvi, drugi, itd. stupac. w $NF – posljednji stupac w v Često korištene ugrađene varijable NF – broj stupaca u trenutnom retku w NR – broj redaka do sada w v v Stupci su pretpostavljeno odvojeni prazninama ls –l | awk '{print $9}' w Ispisuje devetu riječ u svakom retku – ime datoteke 75
Alati: awk v v Uvjeti slični C-u $1 == "0. 0" {print $2} $1 ~ /RI/ {print $0; exit} $8 != "eth 0" && $1 ~ /^161. 53. / {print "Cudna ruta " $0} ~ - podudarnost sa regexpom, negacija !~ /RI/ bez ostalih oznaka provjerava cijeli redak /mp 3$/ { m++; } Dodatna konfiguracija putem posebnih varijabli, npr. FS – field separator, čime su odvojeni stupci w IGNORECASE w 76
primjeri: awk $ cat popis | awk '/b. */' zamjena za grep burek. dpkg-old $ awk '/b. */' popis zamjena za grep burek. dpkg-old $ netstat –rn | awk '$1 == "0. 0" {print $2}' ispiše default gateway $ iptables –L | awk '/INPUT/, /^$/' kao u sedu ispiše samo retke vezane za INPUT lanac 77
Zadatak: što radi ovaj izraz? rm `ls –al | grep string | awk ‘($9 !~ /^string/) {print $9}’` v Briše sve datoteke koje sadrže “string”, osim onih kod kojih je string na početku. v Što će se dogoditi ako zamijenite !~ sa ~? Što će se dogoditi ako neka datoteka ima razmak u imenu? v ©UGU 78
Vježba 1 v Napišite RI koji će pronaći datume oblika: dd. mm. gggg te dd. mm. gg v Oprez! Koristite graničnike <, >, b da izraz ne pronađe datum tamo gdje ga zapravo nema 79
Vježba U tekstualnoj datoteci pronađite sve riječi koje se se ponavljaju. v uputa: grep ne zna za reference, egrep zna v 80
Vježba v Napišite RI koji će pronaći tekst oblika http: //www. carnet. hr i zamijeniti ga s <A HREF="http: //www. carnet. hr">carnet</A> v Pokušajte prvo pronaći dovoljno dobar RI za URL, pa zatim u njemu izdvojite srednji dio imena stroja. 81
Primjer: Java. Script v Zadatak: spriječi unos LDAP korisničkog imena oblika: korisnik. domena, forsiraj oblik korisnik@domena. hr. if (string. search(/^[A-Za-z 0 -9-_]+. [A-Za-z 0 -9-]+$/i) != -1) { alert("'korisnik. domena' ne vrijedi. Koristite 'korisnik@domena. hr'"); document. imaplogin. imapuser. focus(); return false; } © Želja 82
Primjer: logcheck v Zadatak: spriječi logcheck da bilježi ovakve poruke: Feb 14 10: 01 po sm-mta[22624]: k 1 E 9012 X 022624: from=<virusalert@po. os. carnet. hr>, size=1779, class=0, nrcpts=1, msgid=<VAk 1 E 8 i 0 jg 011483@po>, proto=ESMTP, daemon=MSA, relay=smmsp@localhost. os. carnet. hr [127. 0. 0. 1] v /etc/logcheck/violations. ignore. d/logcheck-sendmail: ^w{3} [ : 0 -9]{11} [. _[: alnum: ]-]+ (sendmail|sm(mta|msp|que))[[0 -9]+]: [[: alnum: ]]+: . *virusalert@po. os. carnet. hr. *$ ©Želja 83
Rezime: osnovni metaznakovi v Osnovni RI w ^. $ [] () sed, grep početak retka bilo koji znak kraj retka klase znakova [a-z] grupiranje (A) citiranje narednog metaznaka v Prošireni RI w ^. $ | () [] egrep, ostali alati početak retka bilo koji znak kraj retka alternative A|B grupiranje (A) klase znakova [a-z] citiranje narednog metaznaka . , \ 84
Rezime: ponavljanje v Osnovni RI w sed, grep * 0 ili više ponavljanja prethodnog znaka/izraza v Prošireni RI w grep -E, ostali alati a? 0 ili 1 a a* 0 ili više a+ 1 ili više a{n} n ponavljanja a{n, } n ili više a{n, m} između n i m ponavljanja 85
Rezime: provjera mjesta v v v Graničnici b mjesto ruba riječi (početak ili kraj) B mjesto unutar riječi < početak riječi > kraj riječi Lookahead / lookbehind (? =izraz) na ovom mjestu u tekstu se nalazi izraz (? !izraz) na ovoj poziciji ne smije biti izraz (? <=izraz) ispred ove pozicije se nalazi izraz (? <!izraz) na ovoj poziciji u tekstu slijedi izraz Lookaround ne "jede" znakove u tekstu 86
Rezime: klase v v v d D w W s S znamenka sve osim znamenke slova+znamke+tocka sve osim znakova iz W razmak, tab, novi red sve osim praznina Ostale kratice v t tab v n line-feed w unix novi red v r carriage-return w rn – DOS novi red v a bell POSIX klase (GNU grep, Perl) v [: alpha: ] slovo v [: digit: ] znamenke v [: alnum: ] slova i znamenke v [: blank: ] razmak, tab v [: space: ] blank+novi red v [: cntrl: ] kontrolni znakovi v [: graph: ] vidljivi znak. . . v [: print: ]. . . uključujući razmak v [: punct: ]. . . koji nije slovo, znamenka ili razmak v [: lower: ], [: upper: ] v [: xdigit: ] egrep ’^[[: upper: ]]+$’ popis 87
Knjige v Jednostavni uvod: Teach Yourself Regular Expressions in 10 Minutes Sams, ISBN: 0 -672 -32566 -7 v Referenca / za napredne: Jeffrey Friedl Mastering Regular Expressions O'Reilly, ISBN 0596002890 88
Linkovi http: //www. regular-expressions. info/quickstart. html http: //en. wikipedia. org/wiki/Regular_expression http: //sitescooper. org/tao_regexps. html http: //www. amk. ca/python/howto/regex/ http: //ruddo. com/projects/wp-search-replace/wp-searchreplace-regexptut/ http: //gnosis. cx/publish/programming/regular_expressions. h tml http: //codeproject. com/dotnet/Regex. Tutorial. asp 89
- Coeficiente de atrito
- Dmitrovi
- Dmitrovi
- Dmitrovi
- Xkcd regular expressions
- Regular expressions wikipedia
- Construction of epsilon nfa from regular expression
- Simplify the rational expression
- Regular expressions
- Regex
- I formal
- Regular language
- Primitive regular expressions
- Regular grammar generates regular language
- Aco
- Limite de resistência
- Tabela de transpasse de barras de aço
- Bodas de aço
- Tensão deformação aço
- Aço ntu-qc-250
- Estruturas
- Ques aco
- Alma de cabo de aço
- Http://dlib.nyu.edu/aco/
- Dcma aco lookup
- Aço e ferro fundido
- Aco analytics
- Aco drains usa
- Rugosidade absoluta
- Aco 101
- Zoran zoričić
- Zoran radovanovi
- Zoran kunica
- Zoran miljanic ucg
- Zoran hercigonja
- Bem
- Zoran budimac
- Darko babovic
- Zoran vojic
- Zoran tiganj
- Zoran galic ucla
- Cikatriks
- Cin 7 login
- Rikardijanska ekvivalencija
- Zoran vajagić
- Zoran hercigonja
- Zoran leban trojar
- Solar banat
- Zoran tuning
- "dr. stephen kao"
- Zoran budimac
- Zoran drvenkar steckbrief
- Zoran čorkalo
- Zoran tocilj split
- Radical and rational expressions
- Evaluate 32 3/5
- Almost negative expressions
- Simplified radical form
- Simplifying expressions questions
- 8-1 multiplying and dividing rational expressions
- 1-1 variables and expressions answer key
- Arithmetic expressions containing a null value evaluate to
- Expressions of fear
- Multiplying and dividing rational expressions quizlet
- Evaluating algebraic expressions quiz
- Reducing rational expressions to lowest terms
- Simplifying expressions algebra 1
- Writing expressions word problems
- Simplify each radical expression
- Pascal elseif
- Use the example as a model. simplify the expressions. i^37
- Adding subtracting and multiplying radical expressions
- Phrases of quantity food
- Logarithm rules and examples
- 10 primary emotions carroll izard
- 8-2 multiplying and dividing rational expressions
- Example of irrational algebraic expression
- Modeling algebraic expressions
- 11-4 practice multiplying and dividing rational expressions
- Expressions avec faire
- Parent flamingos lose their intense pink coloring until …
- Simplify surd expressions
- Indirect answers to direct questions
- Lesson 2 the distributive property
- Terms algebraic expressions
- Simplifying radical expressions algebra 2
- Simplify the following expressions
- Evaluate 32 3/5
- Circle the expression that can be written as 3cd
- Lesson 4 work with algebraic expressions