Regular Expressions Zoran Delajlija Aco Dmitrovi 1 Drugovi

  • Slides: 89
Download presentation
Regular Expressions Zoran Dželajlija & Aco Dmitrović 1

Regular Expressions Zoran Dželajlija & Aco Dmitrović 1

Drugovi Dinko Korunić v Željko Boroš v Zdenko Škiljan v Unix Guru Universe v

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

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

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

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

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

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

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

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

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

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

Č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

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

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

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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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:

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 , *, ?

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.

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

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

^ 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

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

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.

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

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

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.

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

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 '.

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

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

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

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

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

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

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

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,

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=<[^>]*>'

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

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

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.

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, .

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:

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

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

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)

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

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

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]

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:

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/// 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 '.

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

Pitanja? 68

Podizrazi i reference v v v s/(Language. Priority)s+(. *)/1 hr 2/ 1, 2, .

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.

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 ? –

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

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?

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

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

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

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

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

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

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

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

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

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

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

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

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)

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

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

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

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