Jedna od stvari koju sam oduvijek volio na Linux terminalu je ono što se može postići korištenjem regularnih izraza. Bez obzira trebamo li pronaći komplicirani tekst ili ga zamijeniti nečim drugim, upotreba regularnih izraza može uvelike pojednostaviti posao. Krenimo od početka:
Što je regularni izraz?
Regularni izraz je niz posebnih znakova koji nam omogućuju opisivanje teksta koji želimo pronaći. Na primjer, ako bismo željeli tražiti riječ "linux", bilo bi dovoljno da tu riječ stavimo u program koji koristimo. Sama riječ je redoviti izraz. Zasad se čini vrlo jednostavno, ali što ako želimo pronaći sve brojeve u određenoj datoteci? Ili svi redovi koji počinju velikim slovom? U tim slučajevima više ne možete staviti jednostavnu riječ. Rješenje je uporaba regularnog izraza.
Regularni izrazi nasuprot obrascima datoteka.
Prije nego što uđem u regularne izraze, želim razjasniti uobičajeni nesporazum oko regularnih izraza. Regularni izraz nije ono što stavljamo kao parametar u naredbe poput rm, cp itd. Za upućivanje na razne datoteke na tvrdom disku. To bi bio obrazac datoteke. Regularni izrazi, iako slični jer koriste neke uobičajene znakove, različiti su. Uzorak datoteke aktivira se prema datotekama na tvrdom disku i vraća one koje se u potpunosti podudaraju s uzorkom, dok se regularni izraz aktivira prema tekstu i vraća retke koji sadrže traženi tekst. Na primjer, regularni izraz koji odgovara uzorku *.*
bilo bi nešto poput ^.*\..*$
Vrste regularnih izraza.
Ne koriste svi programi iste regularne izraze. Ne puno manje. Postoji nekoliko više ili manje standardnih tipova regularnih izraza, ali postoje programi koji malo mijenjaju sintaksu, uključuju vlastita proširenja ili čak koriste potpuno različite znakove. Stoga, kada želite koristiti regularne izraze s programom koji ne poznajete dobro, prvo što trebate učiniti je pogledati priručnik ili dokumentaciju programa da biste vidjeli kakvi su regularni izrazi koje prepoznaje.
Prvo, postoje dvije glavne vrste regularnih izraza koje sadrži POSIX standard, a to je ono što Linux alati koriste. Oni su osnovni i prošireni regularni izrazi. Mnoge naredbe koje rade s regularnim izrazima, poput grep ili sed, omogućuju vam upotrebu ove dvije vrste. O njima ću govoriti u nastavku. Postoje i regularni izrazi u PERL stilu, a zatim postoje programi poput vim ili emacs koji koriste njihove varijante. Ovisno o tome što želimo učiniti, možda je prikladnije koristiti jedno ili drugo.
Testiranje regularnih izraza.
Sintaksa regularnih izraza nije ništa trivijalno. Kad moramo napisati komplicirani regularni izraz, nalazit ćemo se pred nizom posebnih znakova koje je na prvi pogled nemoguće razumjeti, pa je za naučiti kako ih koristiti neophodno imati način za obavljanje svih testova koje želimo i lako vidjeti rezultate. Zbog toga ću sada staviti nekoliko naredbi pomoću kojih možemo raditi testove i eksperimentirati sve što nam treba dok ne dominiramo regularnim izrazima.
Prva je grep naredba. To je naredba koju ćemo najčešće koristiti za pretraživanja. Sintaksa je sljedeća:
grep [-E] 'REGEX' FICHERO
COMANDO | grep [-E] 'REGEX'
Preporučujem uvijek stavljanje regularnih izraza u pojedinačne navodnike kako nas ljuska ne bi poludila. Prvi način je pronaći regularni izraz u datoteci. Drugi omogućuje filtriranje izlaza naredbe kroz regularni izraz. Prema zadanim postavkama grep koristi osnovne regularne izraze. Opcija -E je za upotrebu proširenih regularnih izraza.
Trik koji nam može pomoći da vidimo kako funkcioniraju regularni izrazi je omogućavanje upotrebe boje u naredbi grep. Na taj će način biti istaknut dio teksta koji odgovara regularnom izrazu koji koristimo. Da biste aktivirali boju u naredbi grep, samo provjerite je li varijabla okoline GREP_OPTIONS
sadrže u vrijednosti --color
, što se može učiniti ovom naredbom:
GREP_OPTIONS=--color
Možemo ga staviti u .bashrc da ga uvijek aktiviramo.
Drugi način korištenja regularnih izraza je upotrebom naredbe sed. Ovo je prikladnije za zamjenu teksta, ali se može koristiti i za pretraživanje. Sintaksa bi bila sljedeća:
sed -n[r] '/REGEX/p' FICHERO
COMANDO | sed -n[r] '/REGEX/p'
Naredba sed također koristi osnovne regularne izraze prema zadanim postavkama, a možete koristiti proširene regularne izraze s opcijom -r.
Još jedna naredba koju također želim imenovati je awk. Ova se naredba može koristiti za mnoge stvari, jer vam omogućuje pisanje skripti na vašem vlastitom programskom jeziku. Ako ono što želimo jest traženje regularnog izraza u datoteci ili u izlazu naredbe, način na koji bi se koristio bio bi sljedeći:
awk '/REGEX/' FICHERO
COMANDO | awk '/REGEX/'
Ova naredba uvijek koristi proširene regularne izraze.
Za naše testove trebat će nam i tekst koji služi kao primjer za pretraživanje u njemu. Možemo se poslužiti sljedećim tekstom:
- Lista de páginas wiki: ArchLinux: https://wiki.archlinux.org/ Gentoo: https://wiki.gentoo.org/wiki/Main_Page CentOS: http://wiki.centos.org/ Debian: https://wiki.debian.org/ Ubuntu: https://wiki.ubuntu.com/ - Fechas de lanzamiento: Arch Linux: 11-03-2002 Gentoo: 31/03/2002 CentOs: 14-05-2004 03:32:38 Debian: 16/08/1993 Ubuntu: 20/10/2004 Desde Linux Rulez.
Ovo je tekst koji ću koristiti za primjere u ostatku posta, pa preporučujem da ga kopirate u datoteku kako bi vam bio pri ruci s terminala. Možete staviti ime koje želite. Nazvao sam ga regularnim izrazom.
Početna lekcija.
Sada imamo sve što je potrebno za započinjanje testiranja regularnih izraza. Idemo malo po malo. Navest ću nekoliko primjera pretraživanja s regularnim izrazima u kojima ću objasniti čemu služi svaki lik. Nisu baš dobri primjeri, ali budući da ću imati vrlo dugačak post, ne želim ga više komplicirati. A ja ću samo ogrebati površinu onoga što se može učiniti regularnim izrazima.
Najjednostavnije od svega je traženje određene riječi, na primjer, pretpostavimo da želimo tražiti sve retke koji sadrže riječ "Linux". Ovo je najlakše, jer moramo samo napisati:
grep 'Linux' regex
I možemo vidjeti rezultat:
SvodLinux: https://wiki.archlinux.org/ Arch Linux: 11-03-2002 Od Linux Rulez.
To su tri retka koji sadrže riječ "Linux" koja će, ako smo koristili trik u boji, biti istaknuta. Imajte na umu da prepoznaje riječ koju tražimo čak i ako je dio duže riječi kao u "ArchLinux". Međutim, ne ističe riječ "linux" koja se pojavljuje u URL-u "https://wiki.archlinux.org/". To je zato što se tamo pojavljuje s malim slovom "l" i tražili smo ga s velikim slovom. Naredba grep ima mogućnosti za to, ali neću o njima govoriti u članku koji se bavi regularnim izrazima.
Ovim jednostavnim testom možemo izvući prvi zaključak:
- Normalni znak stavljen u regularni izraz poklapa se sam sa sobom.
Što znači da ako unesete slovo "a" ono će tražiti slovo "a". Čini se logičnim, zar ne?
Sad pretpostavimo da želimo tražiti riječ "CentO" iza koje slijedi bilo koji znak, ali samo jedan znak. Za to možemo koristiti znak ".", Koji je zamjenski znak koji odgovara bilo kojem znaku, ali samo jednom:
grep 'CentO.' regex
A rezultat je:
CentOS: http://wiki.centos.org/ centi: 14-05-2004 03:32:38
Što znači da uključuje "S" u "CentOS-u", iako je u jednom slučaju veliko, a u drugom malom. Ako bi se na tom mjestu pojavio bilo koji drugi lik, on bi ga također uključio. Već imamo drugo pravilo:
- Lik "." odgovara bilo kojem liku.
Nije više tako trivijalno kako se činilo, ali s ovim ne možemo puno učiniti. Idemo malo dalje. Pretpostavimo da želimo pronaći retke u kojima se pojavljuju 2002. i 2004. Izgledaju kao dva pretraživanja, ali mogu se odjednom izvršiti ovako:
grep '200[24]' regex
Što znači da želimo pronaći broj 200 iza kojeg slijede 2 ili 4. A rezultat je sljedeći:
ArchLinux: 11-03-2002 Gentoo: 31. /2002 CentO: 14-05-2004 03:32:38 Ubuntu: 20/10/2004
Što nas dovodi do trećeg pravila:
- Višestruki znakovi zatvoreni u zagrade podudaraju se s bilo kojim od znakova u zagradama.
Zagrade daju više igre. mogu se koristiti i za izuzeće znakova. Na primjer, pretpostavimo da želimo pronaći web mjesta na kojima se pojavljuje znak ":", ali ne slijedi "/". Naredba bi bila sljedeća:
grep ':[^/]' regex
Jednostavno je pitanje stavljanja "^" kao prvog znaka unutar zagrade. Sve željene likove možete staviti ispod. Rezultat ove posljednje naredbe je sljedeći:
ArchLinux: https://wiki.archlinux.org/ Gentoo: https://wiki.gentoo.org/wiki/Main_Page CentOS: http://wiki.centos.org/ Debian: https://wiki.debian.org/ Ubuntu: https://wiki.ubuntu.com/ Arch Linux: 11 Gentoo: 31. CentOs: 14-05-2004 03:32:38 Debian: 16 Ubuntu: 20/10/2004
Sada su označena ":" iza naziva distroa, ali ne i ona u URL-ovima jer URL-ovi iza njih imaju "/".
- Stavljanje znaka "^" na početak zagrade odgovara bilo kojem znaku, osim ostalim znakovima u zagradi.
Druga stvar koju možemo učiniti je odrediti niz znakova. Na primjer, ako tražite bilo koji broj iza kojeg slijedi "-", to bi izgledalo ovako:
grep '[0-9]-' regex
Ovim određujemo znak između 0 i 9, a zatim znak minus. Pogledajmo rezultat:
ArchLinux: 11-03-2002 CentOs: 14-05-2004 03: 32: 38
U zagradama se može navesti više raspona za miješanje raspona s pojedinačnim znakovima.
- Postavljanje dva znaka odvojena znakom "-" unutar zagrada podudara se s bilo kojim znakom unutar raspona.
Pogledajmo sada možemo li odabrati prvi dio URL-ova. Ona koja kaže "http" ili "https". Razlikuju se samo u posljednjim "s", pa učinimo to na sljedeći način:
grep -E 'https?' regex
Znak pitanja koristi se za to da znak s lijeve strane postane neobavezan. Ali sada smo naredbi dodali opciju -E. To je zato što je ispitivanje značajka proširenih regularnih izraza. Do sada smo koristili osnovne regularne izraze, pa nismo trebali ništa unositi. Pogledajmo rezultat:
ArchLinux: https: //wiki.archlinux.org/ Gentoo: https: //wiki.gentoo.org/wiki/Main_Page CentOS: http: //wiki.centos.org/ Debian: https: //wiki.debian.org/ Ubuntu: https: //wiki.ubuntu.com/
Dakle, već imamo novo pravilo:
- Lik iza kojeg slijedi "?" odgovara tom liku ili nijednom. To vrijedi samo za proširene regularne izraze.
Sada ćemo potražiti dvije potpuno različite riječi. Pogledajmo kako pronaći retke koji sadrže i riječ "Debian" i "Ubuntu".
grep -E 'Debian|Ubuntu' regex
Okomitom trakom možemo razdvojiti dva ili više različitih regularnih izraza i tražiti linije koje odgovaraju bilo kojem od njih:
Debian: https://wiki.debian.org/ Ubuntu: https://wiki.ubuntu.com/ Debian: 16 / 08 / 1993 Ubuntu: 20 / 10 / 2004
- Lik «|» služi za odvajanje nekoliko regularnih izraza i podudaranja s bilo kojim od njih. Također je specifičan za proširene regularne izraze.
Nastavimo. Sada ćemo tražiti riječ "Linux", ali samo tamo gdje nije zalijepljena za drugu riječ s lijeve strane. Možemo to učiniti ovako:
grep '\
Ovdje je važan znak "<", ali treba ga izbjeći stavljanjem "\" ispred njega, tako da će ga grep protumačiti kao poseban znak. Rezultat je sljedeći:
Svod Linux: 11-03-2002 Od Linux Rulez.
Također možete upotrijebiti "\>" za traženje riječi koje nisu točno jedna uz drugu. Idemo s primjerom. Pokušajmo s ovom naredbom:
grep 'http\>' regex
Rezultat je sljedeći:
CentOS: http: //wiki.centos.org/
Izašao je "Http", ali ne i "https", jer u "https" još uvijek postoji znak desno od "p" koji može biti dio riječi.
- Znakovi "<" i ">" odgovaraju početku i kraju riječi. Ti se znakovi moraju izbjeći kako se ne bi tumačili kao doslovni znakovi.
Idemo sa stvarima malo kompliciranijima. Znak "+" odgovara liku s lijeve strane, ponovljen barem jednom. Ovaj je znak dostupan samo s proširenim regularnim izrazima. Pomoću nje možemo pretraživati, na primjer, sekvence nekoliko brojeva u nizu koji počinju s ":".
grep -E ':[0-9]+' regex
rezultat:
CentOs: 14. 05: 32: 38
Broj 38 je također istaknut jer također započinje s ":".
- Znak "+" odgovara liku s lijeve strane, ponovljen barem jednom.
Također možete kontrolirati broj ponavljanja pomoću "{" i "}". Ideja je staviti u zagrade broj koji pokazuje točan broj ponavljanja koja želimo. Također možete staviti niz. Pogledajmo primjere dva slučaja.
Prvo ćemo pronaći sve četveroznamenkaste sekvence koje postoje:
grep '[0-9]\{4\}' regex
Primijetite da morate pobjeći iz kovrčavih zagrada ako koristite osnovne regularne izraze, ali ne i ako koristite proširene. S proširenim bi bilo ovako:
grep -E '[0-9]{4}' regex
A rezultat u oba slučaja bio bi sljedeći:
ArchLinux: 11-03-2002 Gentoo: 31. /2002 CentO: 14-05-2004 03:32:38 Debian: 16/08/1993 Ubuntu: 20/10 /2004
- Znakovi "{" i "}" s brojem između njih podudaraju se s prethodnim znakom ponovljenim navedenim brojem puta.
Sada drugi primjer s aparatićem. Pretpostavimo da želimo pronaći riječi koje imaju između 3 i 6 malih slova. Mogli bismo učiniti sljedeće:
grep '[a-z]\{3,6\}' regex
A rezultat bi bio sljedeći:
- ONIista de stranicas wiki: TOrchLinux: https:/ /wiki.Arch Linux.org/ Gzatim: https:/ /wiki.gentoo.org/wiki/Main_Pstarost CentOS: http:/ /wiki.CentOS.org/ Debian: https:/ /wiki.debian.org/ ILIslijepa ulica: https:/ /wiki.ubuntu.com/ - Fti nedostaješ de lansiranje: TOrch Linux: 11-03-2002 Gzatim: 31. CentOs: 14-05-2004 03:32:38 Debian: 16. Uslijepa ulica: 20. Dto je Linux Rulez.
Što, kao što vidite, ne izgleda previše poput onoga što smo željeli. To je zato što regularni izraz pronalazi slova u drugim riječima koje su duže. Pokušajmo s ovom drugom verzijom:
grep '\<[a-z]\{3,6\}\>' regex
rezultat:
- Popis stranica wiki: ArchLinux: https:/ /wiki.archlinux.org/ Gentoo: https:/ /wiki.gentoo.org/wiki/ Main_Page CentOS: http:/ /wiki.CentOS.org/ Debian: https:/ /wiki.debian.org/ Ubuntu: https:/ /wiki.ubuntu.com/
Ovo već više sliči onome što smo željeli. Ono što smo učinili jest da zahtijeva da riječ započne neposredno prije prvog slova i završi neposredno nakon posljednjeg.
- Znakovi "{" i "}" s dva broja između njih odvojena zarezom podudaraju se s prethodnim znakom, ponovljenim brojem puta koja su označila dva broja.
Pogledajmo sada lik koji je prvorazredni znak "+". To je "*" i njegovo je djelovanje vrlo slično samo što se podudara s bilo kojim brojem znakova, uključujući nulu. Odnosno, radi isto kao i "+", ali ne zahtijeva da se znak s lijeve strane pojavi u tekstu. Na primjer, pokušajmo potražiti one adrese koje počinju na wikiju, a završavaju na org:
grep 'wiki.*org' regex
Pogledajmo rezultat:
ArchLinux: https: //wiki.archlinux.org/ Gentoo: https: //wiki.gentoo.org/ wiki / Main_Page CentOS: http: //wiki.centos.org/ Debian: https: //wiki.debian.org/
Savršeno.
Sad posljednji lik koji ćemo vidjeti. Znak "\" koristi se za bijeg od znaka s njegove desne strane, tako da on gubi svoje posebno značenje. Na primjer: Pretpostavimo da želimo locirati linije koje završavaju točkom. Prvo što bi nam moglo pasti na pamet moglo bi biti ovo:
grep '.$' regex
Rezultat nije ono što tražimo:
- Popis wiki stranica: ArchLinux: https://wiki.archlinux.org/ Gentoo: https://wiki.gentoo.org/wiki/Main_Page CentOS: http://wiki.centos.org/ Debian: https://wiki.debian.org/ Ubuntu: https://wiki.ubuntu.com/ - Datumi izdanja: Arch Linux: 11-03-2002 Gentoo: 312 CentOs: 14-05-2004 03:32:38 Debian: 163 Ubuntu: 204 Iz Linuxa Rulez.
To je zato što "." podudara se s bilo čime, tako da se regularni izraz podudara sa zadnjim znakom svakog retka kakav god bio. Rješenje je sljedeće:
grep '\.$' regex
Sada je rezultat ono što želimo:
Iz Linuxa Rulez.
Igra je završena
Iako je tema regularnih izraza toliko složena da bih je dao za niz članaka, mislim da sam vam već zadao dovoljno boli. Ako ste uspjeli stići, čestitamo. A ako ste sve ovo pročitali u jednom zasjedanju, uzmite aspirin ili nešto slično, jer to ne može biti dobro.
Za sada je to sve. Ako vam se sviđa ovaj članak, možda možete napisati drugi. U međuvremenu preporučujem da isprobate sve regularne izraze u terminalu kako biste jasno vidjeli kako funkcioniraju. I upamtite: samo Chuck Norris može raščlaniti HTML pomoću regularnih izraza.
Kakav bi bio naš život bez regularnog izraza?
Članak je vrlo koristan, ali pročitat ću ga malo po malo. Hvala puno.
Hvala vam na komentaru. Još uvijek ne vjerujem da je izašao moj članak. 🙂 Izašlo je s pogreškom, ali nadam se da je korisno. 🙂
Hvala vamssssssss! ..
Prije nekog vremena morao sam malo učiti o regularnim izrazima .. ..Hvala vam na podučavanju .. i detaljnom vodiču kako bih naučio svaki od njih ..
Vrlo dobro! .. .. Idem po onaj aspirin .. ee
Molim. Hrabrost i da regularni izrazi ne mogu s vama. 🙂
Fantastičan post! Odličan posao. Pitam se koliko vam je sati trebalo 😀
LOL!! Pitanje je: Koliko bi mi sati trebalo da sam rekao sve što sam namjeravao reći? Beskonačno !! 🙂
jedno nisam znao, dobar članak!
Hvala vam. Zadovoljstvo je podijeliti ga s vama.
sjajno objašnjenje. čestitam! stvarno korisno!
Drago mi je što vam je bilo korisno. Stoga je zadovoljstvo pisati.
Ovo bi trebalo ići negdje posebno. Poput Istaknutog, ali koji ima vrlo specifičnu korisnost. Prilično korisno, iako bih volio da se to primijeni na Vima.
To je pitanje postavljanja samog sebe. Imam na umu još nekoliko članaka o regularnim izrazima. I mogao bih razgovarati o vim u njima. Ima neke razlike od onoga što sam objasnio u ovom članku. Stvar je u tome da se nastavi s tim. 🙂
Dobro!
Vaš je članak vrlo dobar, znatiželjan je, nedavno sam (upravo sada) na svojoj web stranici objavio unos koji sam pripremao nekoliko dana, gdje sam prikupio popis metaznaka za regularne izraze i neke primjere. I bilo je pošteno ući u DesdeLinux i vidjeti unos na istu temu!
Ako je ikakva utjeha, moja je PUNO PUSIJA US
Svakako su regularni izrazi jedna od najkorisnijih stvari, obično ih koristim za obrezivanje izlaza naredbi i zadržavanje dijela koji me zanima, a zatim, na primjer, u interakciji s njim u bash skripti. Također sam ih puno koristio na sveučilištu, a oni su od vitalne važnosti u izradi sastavljača (u definiciji leksikografskih i raščlanjivača). Ukratko, cijeli svijet.
Pozdrav i jako jako dobar posao.
Puno hvala.
Svidio mi se i vaš članak. Sažetiji je od mog. Može poslužiti kao brza referenca. Slučajnost je da smo ih napisali istodobno. Možete vidjeti da ljude zanima tema. 🙂
Regularni izrazi za lutke =), sada mi je jasnije, usput rečeno, jedan od načina da se dobije izlaz sa bojom za grep je stvaranje zamjenskog imena u .bashrc aliasu grep = 'grep –color = always', u slučaju da nekome odgovara .
pozdravi
Pravi. To je još jedan način da se to učini. Hvala na unosu. 🙂
O_O ... prilog !!! O_O ...
Puno vam hvala na postu, neko vrijeme sam čekao tako nešto hahaha, već ga ostavljam otvorenim da ga mirno čitam kod kuće s nula gnjavaže da se koncentriram hahaha.
Hvala na članku, stvarno znam 😀
Znala sam da će ti se svidjeti. LOL!! Istina je da mnoge stvari nedostaju, ali već imam na umu drugi dio. 🙂
Sjajan članak, da sam ga pročitao jučer, predavanje koje sam danas održao bio bi još lakši za moje učenike!
LOL!! Šteta što sam zakasnio, ali drago mi je što je korisno. 🙂
Napokon !!!, post je super dobar ... Napokon sam pronašao nešto što jasno objašnjava regularne izraze ... ..
Puno je informacija vani, ali teže je pronaći nešto što je lako razumljivo. Drago mi je što sam popunio tu prazninu. 🙂
Pozdrav.
Hej, trebam pomoć, moram pretražiti / var / logs u formatu: yymmdd, a zapisnici dolaze ovako 130901.log -130901.log, moram pretražiti sve one koji su između 1. rujna i 11. listopada, Jedino što sam uspio učiniti bilo je ukloniti cijeli rujan, ali ne znam kako napraviti cijeli lanac:
ex: 1309 [0-3] vraća zapisnike između 1. i 30. rujna, ali ne znam kako ih dobiti u istom lancu od 1. do 11. listopada.
Učiniti to pomoću regularnih izraza pomalo je složeno. Pada mi na pamet da bi ovako nešto moglo uspjeti:
13(09[0-3]|10(0|1[01]))
To je prošireni regularni izraz. Ne kažete koji alat koristite, pa vam ne mogu dati više detalja.
U svakom slučaju mislim da je to slučaj, umjesto da koristim regularne izraze, bolje je to učiniti s findom. Možete probati nešto poput ovoga:
pronaći. -newermt '01 sep '-a! -newermt '11 okt '-tisak
Sreća. Nadam se da vam ovo može pomoći.
Pozdrav! Prije svega, htio sam vam zahvaliti na vašem radu jer je ova stranica među mojih "top 3" najboljih Linux stranica.
Vježbala sam i nisam znala zašto mi RegExp na telefonskom broju nije radio i bilo je da mi nedostaje "-E" (što sam shvatio zahvaljujući ovom postu).
Htio sam te pitati ne znaš li dobar pdf ili web mjesto na kojem postoje vježbe na RegExp-u, iako s malo mašte možete vježbati da ih sami izmišljate.
Pozdrav, Pablo.
Vrlo dobro, upravo sam sve pročitao i da, sad mi treba aspirin 🙂
Najbolje objašnjenje koje sam vidio za regularne izraze. Zahvaljujem se autoru što je podijelio ovo djelo.
Pozdrav.
Jako mi se svidjelo vrlo dobro objašnjenje