250 likes | 352 Views
Brisanje praznih redaka. $ sed -e '/^$/d' file > new file Unutar navodnika ('), znakovi (/) omeđuju RI koji će interpret irati sed ^ početak $, kraj retka, ništa između d delete , briši retke koji se podudaraju
E N D
Brisanje praznih redaka $ sed -e '/^$/d' file > newfile • Unutar navodnika ('), znakovi (/) omeđujuRIkoji će interpretirati sed • ^ početak $, kraj retka, ništa između • d delete, briši retke koji se podudaraju • Standardno ponašanje sed-a je ispis svakog retka, sve osim praznih redaka bitće prepisano
Wikipedia • Regularni izraz je niz znakova (string) koji opisuje, ili se podudara (matches) sa skupom znakova, u skladu sa sintaksnim pravilima • RI koriste uređivači teksta, alati za pretraživanje, i programski jezici (Perl, Python, Tcl, PHP) • Alati Unixa prvi su popularizirali koncept RI (grep, sed, awk…)
Definicija • RI, često zvan i “uzorak”, jest izraz koji opisuje skup znakova (strings). • Skraćen opis skupa, bez nabrajanja svih članova • Isti skup mogu opisivati različiti uzorci. • više rješenja za isti problem
Alternative • izbor, jedna od ponuđenih mogućnosti • “|” prečka, okomita crta • odvaja moguće izbore • “M|F”, “\+|-”, “a|e|i|o|u”
Grupiranje • () • zagrade određuju doseg i prvenstvo operatora • Primjeri: • (b|k)rdo je isto kao (brdo|krdo)
Kvantifikacija • Nakon znaka ili grupe znakova određuje broj ponavljanja • ? 0 ili 1 pojava prethodnog izraza • colou?r color i colour • * 0 ili više ponavljanja • “br*” b, br, brr itd. • + barem jedan, odn. jedan ili više • “br+” označava br, brr, brrr itd.
Basic • Stari Unixovi RI, zastarjeli, zamijenjeni Posix proširenjima • većina znakova tretiraju se doslovno, izuzetak su metaznakovi • . bilo koji pojedinačni znak • [] jedan znak od onih koji se nalaze u zagradama • [^] jedan znak koji nije sadržan u zagradama • ^ početak retka • $ kraj reda • \(\) označeni podizraz, blok
\n n je znamenka od 1 do 9, podudara se s n-tim podizrazom (nepravilno) • * ponavljanje • ako se izraz odnosi na pojedinačni znak, 0 ili više ponavljanja tog znaka • na pr. [abc]* “”,a,b,c,ab,ac,bc,abc • {x,y} ponavljanje prethodnog bloka najmanje x, najviše y puta
Posix • definira klase znakova • [:upper:] [A-Z] velika slova • [:lower:] [a-z] mala slova • [:alpha:] [a-zA-Z] slova • [:allnum:] [a-zA-Z0-9] brojke I slova • [:digit:] [0-9] brojke • [:xdigit:] [0-9A-Fa-f] heksadecimalni brojevi
Posix • [:punct:] [.,:;!?] punctuation • [:blank:] [ \t] razmak I tab • [:space:] [\t\n\r\f\v] prazni znakovi • [:cntrl:] kontrolni znakovi • [:graph:] printed characters • [:print:] [^\t\n\r\f\v] printed characters & space
Zadatak • $ sed -e '/^$/d' file > newfile • Preradite RI tako da se brišu prazni retci samo ako ih je više od jedan
Brisanje praznih redaka II • Što ako redak sadrži praznine? • “ “, \t # sed -e '/^[]*$/d' InputFile >OutputFile • U zagrade ubacite razmak i tab.
Brisanje praznih redaka III • Ako se ne služite sed-om: $ cat file1 | grep -v '^$' >file2 $ grep -v "^ *$" file-y > file-x
Brojanje praznih redaka cat filename |awk ' /^['\ '|'\\t']*$/ { ++x } END { print “Br. praznih redaka = " x } '
Decimalni broj • Protumačite ovaj izraz (\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?
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-search-replace-regexptut/ http://gnosis.cx/publish/programming/regular_expressions htmlhttp://codeproject.com/dotnet/RegexTutorial.asp --
[ otv.uglata \ rez ^ kapica $ dolar . točka | prečka ? upitnik * zvjezdica + plus ( otvorena obla zagrada ) zatvorena obla zagrada Metaznakovi
Ponavljanje klase • Ponavlja se cijela klasa, ne samo znak koji se podudara • [0-9]+ podudara se 222 ali I
Look-ahead • Predviđanje? Ovo znaju Perl i Python? • "(?=uzorak)" zero-width positive look-ahead assertion "/\w+(?=\t)/" riječ ako je iza nje tab, koji neće biti u $& • "(?!uzorak)" zero-width negative look-ahead assertion "/slon(?!ica)/" “slon" ako za njim ne slijedi “ica“ Note however that look-ahead and look-behind are NOT the same thing. You cannot use this for look-behind.
Look-behind • Osvrtanje? • "(?<=pattern)" zero-width positive look-behind assertion. "/(?<=\t)\w+/" riječ iza taba, tab nije uključen u $& Works only for fixed-width look-behind • "(?<!pattern)" zero-width negative look-behind assertion "/(?<!na)slon/" “slon" ako nije iza “na“ Works only for fixed-width look-behind
Metaznakovi unutar klase • Neki ostaju metaznakovi: ^ \ - ] • Ako ih doslovno tražimo, treba ih citirati: • [\\x] \ ili x • Neki mijenjaju značenje • [^x] negacija, znak koji nije x • Neke ne treba citirati: • [*+] tražimo zvjezdicu ili plus, isto što i [\*\+] • [\\]] tražimo \ ili ], može i ovako: []\\] • [\^x] ^ ili x, isto što i: [x^]
Vježba • RI koji “hvata” IP adrese • 4 x cijeli broj između 0 i 255, s točkama između brojeva • odn. 4 byta odvojena točkama • na pr. 192.168.0.1
IP adresa • Rješenje: korak po korak, definirajmo moguće kombinacije • 0-99:(\d{1,2}) • 100-199: (1\d{2}) • 200-249:(2[0-4]\d) • 250-255: (25[0-5]) • I točka: \.
IP adresa • jedan od četiri uzorka mora biti istinit: ((\d{1,2}) | (1\d{2}) | (2[0-4]\d) | (25[0-5])) • i još točka: ((\d{1,2}) | (1\d{2}) | (2[0-4]\d) | (25[0-5]))\. • pa sve to još u zagrade: (((\d{1,2}) | (1\d{2}) | (2[0-4]\d) | (25[0-5]))\.) • ponovi tri puta: (((\d{1,2}) | (1\d{2}) | (2[0-4]\d) | (25[0-5]))\.){3} • I dodaj još četvrti byte… (((\d{1,2}) | (1\d{2}) | (2[0-4]\d) | (25[0-5]))\.){3} ((\d{1,2}) | (1\d{2}) | (2[0-4]\d) | (25[0-5]))
Može li to jednostavnije? • [0-9]{1,3}\. [0-9]{1,3}\. [0-9]{1,3}\. [0-9]{1,3} • Je li ovo ispravna IP adresa? 457.999.2.555