Regularni izraz za označavanje bash koda. Korištenje regularnih izraza (regex) u Linuxu. Odnos sa zamjenskim znakovima

grep je kratica za 'globalni pisač regularnih izraza'. grep reže retke koji su vam potrebni iz tekstualnih datoteka koje sadrže tekst koji je odredio korisnik.

grep se može koristiti na dva načina - sam ili u kombinaciji s tokovima.

grep ima vrlo opsežnu funkcionalnost zbog velikog broja opcija koje podržava, kao što su: pretraživanje pomoću uzorka niza ili uzorka regularnog izraza RegExp ili regularnih izraza temeljenih na perlu, itd.

Zbog svoje različite funkcionalnosti, alat grep ima mnogo varijanti, uključujući egrep (prošireni GREP), fgrep (popravljeni GREP), pgrep (Obradi GREP), rgrep (rekurzivni GREP) itd. Ali ove opcije imaju male razlike u odnosu na izvorni grep.

grep opcije

$ grep -V grep (GNU grep) 2.10 Autorska prava (C) 2011 Free Software Foundation, Inc. Licenca GPLv3+

Postoje modifikacije uslužnog programa grep: egrep (s proširenom obradom regularnih izraza), fgrep (koji simbole $*^|()\ tretira kao literale, tj. doslovno), rgrep (s omogućenim rekurzivnim pretraživanjem).

    egrep je isto što i grep -E

    fgrep je isto što i grep -F

    rgrep je isto što i grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] restricted_regex_BRE [datoteka ...]

Naredba grep uspoređuje retke u izvornim datotekama s uzorkom koji specificira limited_regex. Ako nije navedena nijedna datoteka, koristi se standardni unos. Obično se svaki uspješno upareni niz kopira u standardni izlaz; ako postoji nekoliko izvornih datoteka, ime datoteke se navodi prije pronađenog retka. grep koristi kompaktan, nedeterministički algoritam. Ograničeni regularni izrazi (izrazi koji imaju nizove znakova sa svojim značenjima i koriste ograničen skup alfanumeričkih i posebnih znakova) percipiraju se kao predlošci. Imaju isto značenje kao regularni izrazi u izd.

Da biste izbjegli znakove $, *, , ^, |, () i \ iz interpretacije ljuske, najlakše je staviti constrained_regex u jednostruke navodnike.

Mogućnosti:

B Pred svaki red stavlja broj bloka u kojem je pronađen. Ovo može biti korisno kada tražite blokove prema kontekstu (blokovi su numerirani počevši od 0). -c Ispisuje samo broj redaka koji sadrže uzorak. -h Sprječava ispis naziva datoteke koji sadrži odgovarajući redak prije samog retka. Koristi se prilikom pretraživanja više datoteka. -i Zanemaruje velika i mala slova pri usporedbi. -l Ispisuje samo nazive datoteka koje sadrže odgovarajuće nizove, jedan po retku. Ako se uzorak pronađe u više redaka datoteke, naziv datoteke se ne ponavlja. -n Ispisuje prije svakog retka njegov broj u datoteci (redovi su numerirani počevši od 1). -s Potiskuje poruke o nepostojećim ili nečitljivim datotekama. -v Ispisuje sve retke osim onih koji sadrže uzorak. -w Pretražuje izraz kao riječ, kao da je okružen metaznakovima \< и \>.

grep --pomoć

Upotreba: grep [OPCIJA]... UZORAK [DATOTEKA]... Traži UZORAK u svakoj DATOTECI ili standardnom unosu. Prema zadanim postavkama, PATTERN je jednostavan regularni izraz (BRE). Primjer: grep -i "hello world" menu.h main.c Odabir vrste regularnog izraza i njegove interpretacije: -E, --extended-regexp PATTERN - prošireni regularni izraz (ERE) -F, --fixed-regexp PATTERN - nizovi fiksne duljine, odvojeni znakom novog retka -G, --basic-regexp UZORAK - jednostavan regularni izraz (BRE) -P, --perl-regexp UZORAK - Perl regularni izrazi -e, --regexp=UZORAK koriste UZORAK za pretraživanje - f, --file=DATOTEKA uzmi UZORAK iz DATOTEKE -i, --ignore-case zanemari razliku velikih i malih slova -w, --word-regexp UZORAK mora odgovarati svim riječima -x, --line-regexp UZORAK mora odgovarati cijelom redu -z, --null-data linije odvojene su null-bajtom umjesto znakom za završetak retka. Razno: -s, --no-messages potiskuju poruke o pogrešci -v, --revert-match odaberite neusklađene linije -V, - - verzija ispis informacija o verziji i izlaz --help prikaži ovu pomoć i izađi --mmap za kompatibilnost unazad, ignorirano Kontrola izlaza: -m, --max-count=NUM zaustavljanje nakon što navedeni NUM odgovara -b, --byte- ofsetni ispis pomak bajta zajedno s izlaznim linijama -n, --line-number ispis broja linije zajedno s izlaznim linijama --line-buffered ispiranje međuspremnika nakon svake linije -H, --with-filename ispis naziva datoteke za svaki match -h , --no-filename ne pokreni izlaz s nazivom datoteke --label=LABEL koristi LABEL kao naziv datoteke za standardni unos -o, --only-matching prikaži samo dio retka koji odgovara UZORCU -q, --quiet, - -silent potisnuti sve normalne izlaze --binary-files=TYPE pretpostaviti da binarna datoteka ima TYPE binary, text ili without-match. -a, --text isto kao --binary-files=tekst -I isto kao --binary-files=without-match -d, --directories=ACTION kako rukovati direktorijima ACTION se može čitati ), rekurzivno (rekurzivno) ili preskočiti (preskočiti). -D, --devices=ACTION kako rukovati uređajima, FIFO i utičnicama ACTION se može pročitati ili preskočiti -R, -r, --recursive isto kao --directories=recurse --include=F_PATTERN obraditi samo datoteke koje se podudaraju pod F_TEMPLATE - -exclude=F_TEMPLATE preskoči datoteke i direktorije koji odgovaraju F_TEMPLATE --exclude-from=FILE preskoči datoteke koje odgovaraju datotekama predloška iz FILE --exclude-dir=TEMPLATE direktorije koji odgovaraju PATTERN bit će preskočeni -L, - -files-without-match ispis samo Imena DATOTEKA bez podudaranja -l, --files-with-matches ispisuju samo imena DATOTEKA s podudaranjima -c, --count ispisuju samo broj odgovarajućih redaka po DATOTECI -T, --initial-tab align tab (ako je potrebno) - Z, --null ispis bajta 0 nakon naziva DATOTEKE Upravljanje kontekstom: -B, --before-context=NUM ispis BROJ redaka prethodnog konteksta -A, --after-context=NUM ispis BROJ redaka sljedeći kontekst -C, --context[=BROJ] ispis BROJ redaka konteksta -BROJ je isti kao --context=BROJ --color[=WHEN], --colour[=WHEN] koristi oznake za razlikovanje podudaranja linije; WHEN može biti uvijek, nikad ili automatski -U, --binary ne uklanja CR znakove na kraju retka (MSDOS) -u, --unix-byte-offsets pokazuju pomak kao da nema CR-ova (MSDOS ) Umjesto “egrep”, trebalo bi pokrenuti “grep -E”. "grep -F" se pretpostavlja umjesto "fgrep". Bolje je ne pokretati kao "egrep" ili "fgrep". Kada FILE nije naveden ili kada je FILE -, čita se standardni unos. Ako je navedeno manje od dvije datoteke, pretpostavlja se -h. Ako se pronađe podudaranje, izlazni kod će biti 0, a ako ne dođe do pogreške, ili ako opcija -q nije navedena, izlazni kod će biti 2. Prijavite pogreške na: Molimo prijavite pogreške u prijevodu na: GNU Grep početna stranica: Pomoć za rad s GNU programima:

Kako biste u potpunosti obradili tekstove u bash skriptama koristeći sed i awk, samo trebate razumjeti regularne izraze. Implementacije ovog najkorisnijeg alata mogu se pronaći doslovno posvuda, a iako su svi regularni izrazi strukturirani na sličan način i temelje se na istim idejama, rad s njima u različitim okruženjima ima određene značajke. Ovdje ćemo govoriti o regularnim izrazima koji su prikladni za korištenje u skriptama naredbenog retka Linuxa.

Ovaj materijal je zamišljen kao uvod u regularne izraze, namijenjen onima koji možda uopće nisu svjesni što oni jesu. Pa krenimo od samog početka.

Što su regularni izrazi

Mnogi ljudi, kada prvi put vide regularne izraze, odmah pomisle da gledaju besmislenu zbrku znakova. Ali to je, naravno, daleko od slučaja. Na primjer, pogledajte ovaj regularni izraz


Po našem mišljenju, čak će i apsolutni početnik odmah shvatiti kako radi i zašto je potreban :) Ako vam nije sasvim jasno, samo čitajte dalje i sve će doći na svoje mjesto.
Regularni izraz je uzorak koji programi kao što su sed ili awk koriste za filtriranje teksta. Predlošci koriste obične ASCII znakove koji predstavljaju sami sebe i takozvane metaznakove koji imaju posebnu ulogu, na primjer, omogućujući vam da se referirate na određene grupe znakova.

Vrste regularnih izraza

Implementacije regularnih izraza u različitim okruženjima, na primjer, u programskim jezicima kao što su Java, Perl i Python, te u Linux alatima kao što su sed, awk i grep, imaju određene značajke. Ove značajke ovise o takozvanim regularnim izrazima, koji tumače uzorke.
Linux ima dva mehanizma regularnih izraza:
  • Motor koji podržava standard POSIX Basic Regular Expression (BRE).
  • Motor koji podržava standard POSIX Extended Regular Expression (ERE).
Većina uslužnih programa za Linux usklađena je barem s POSIX BRE standardom, ali neki uslužni programi (uključujući sed) razumiju samo podskup BRE standarda. Jedan od razloga za ovo ograničenje je želja da se takvi uslužni programi učine što bržim u obradi teksta.

POSIX ERE standard često se implementira u programske jezike. Omogućuje vam korištenje velikog broja alata pri razvoju regularnih izraza. Na primjer, to mogu biti posebni nizovi znakova za često korištene obrasce, kao što je traženje pojedinačnih riječi ili skupova brojeva u tekstu. Awk podržava ERE standard.

Postoji mnogo načina za razvoj regularnih izraza, ovisno o mišljenju programera i značajkama motora za koji su stvoreni. Nije lako napisati univerzalne regularne izraze koje svaki stroj može razumjeti. Stoga ćemo se usredotočiti na najčešće korištene regularne izraze i pogledati značajke njihove implementacije za sed i awk.

POSIX BRE regularni izrazi

Možda je najjednostavniji BRE obrazac regularni izraz za traženje točnog pojavljivanja niza znakova u tekstu. Ovako izgleda traženje niza u sed-u i awk-u:

$ echo "Ovo je test" | sed -n "/test/p" $ echo "Ovo je test" | awk "/test/(ispiši $0)"

Traženje teksta prema uzorku u sed-u


Traženje teksta prema uzorku u awk

Možda ćete primijetiti da se traženje zadanog uzorka izvodi bez uzimanja u obzir točne lokacije teksta u retku. Osim toga, broj pojavljivanja nije bitan. Nakon što regularni izraz pronađe navedeni tekst bilo gdje u nizu, niz se smatra prikladnim i prosljeđuje se na daljnju obradu.

Kada radite s regularnim izrazima, morate uzeti u obzir da su osjetljivi na velika i mala slova:

$ echo "Ovo je test" | awk "/Test/(ispis $0)" $ echo "Ovo je test" | awk "/test/(ispiši $0)"

Regularni izrazi razlikuju velika i mala slova

Prvi regularni izraz nije pronašao nijedno podudaranje jer se riječ "test", koja počinje velikim slovom, ne pojavljuje u tekstu. Drugi, konfiguriran za traženje riječi napisane velikim slovima, pronašao je odgovarajući redak u toku.

U regularnim izrazima možete koristiti ne samo slova, već i razmake i brojeve:

$ echo "Ovo je opet test 2" | awk "/test 2/(ispiši $0)"

Pronalaženje dijela teksta koji sadrži razmake i brojeve

Razmaci se tretiraju kao regularni znakovi od strane regularnog izraza.

Posebni simboli

Kada koristite različite znakove u regularnim izrazima, morate uzeti u obzir neke stvari. Dakle, postoje neki posebni znakovi, ili metaznakovi, čija upotreba u predlošku zahtijeva poseban pristup. Evo ih:

.*^${}\+?|()
Ako je jedan od njih potreban u predlošku, trebat će ga izbjeći pomoću obrnute kose crte (obrnute kose crte) - \ .

Na primjer, ako trebate pronaći znak dolara u tekstu, morate ga uključiti u predložak, a ispred njega treba staviti znak za izlaz. Recimo da postoji datoteka myfile sa sljedećim tekstom:

Imam 10 dolara u džepu
Znak dolara može se otkriti pomoću ovog uzorka:

$awk "/\$/(ispis $0)" moja datoteka

Korištenje posebnog znaka u uzorku

Osim toga, obrnuta kosa crta također je poseban znak, pa ako je trebate upotrijebiti u uzorku, morat ćete je izbjeći. Izgleda kao dvije kose crte koje slijede jedna za drugom:

$ echo "\ je poseban znak" | awk "/\\/(ispiši $0)"

Izbjegavanje obrnute kose crte

Iako kosa crta nije uključena u gornji popis posebnih znakova, pokušaj njezine upotrebe u regularnom izrazu napisanom za sed ili awk rezultirat će pogreškom:

$ echo "3 / 2" | awk "///(ispiši $0)"

Netočna upotreba kose crte u uzorku

Ako je potrebno, mora se i izbjeći:

$ echo "3 / 2" | awk "/\//(ispiši $0)"

Izbjegavanje kose crte

Simboli sidra

Postoje dva posebna znaka za povezivanje uzorka s početkom ili krajem tekstualnog niza. Znak cap - ^ omogućuje vam da opišete nizove znakova koji se nalaze na početku redaka teksta. Ako je uzorak koji tražite negdje drugdje u nizu, regularni izraz neće odgovoriti na njega. Upotreba ovog simbola izgleda ovako:

$ echo "dobrodošli na likegeeks web stranicu" | awk "/^likegeeks/(print $0)" $ echo "likegeeks web stranica" | awk "/^likegeeks/(ispiši $0)"

Pronalaženje uzorka na početku niza

Znak ^ je dizajniran za traženje uzorka na početku retka, dok se velika i velika slova također uzimaju u obzir. Pogledajmo kako to utječe na obradu tekstualne datoteke:

$awk "/^ovo/(ispiši $0)" moja datoteka


Pronalaženje uzorka na početku retka u tekstu iz datoteke

Kada koristite sed, ako postavite kapu negdje unutar uzorka, ona će se tretirati kao bilo koji drugi uobičajeni znak:

$ echo "Ovo ^ je test" | sed -n "/s ^/p"

Kapica nije na početku uzorka u sed-u

U awk-u, kada koristite isti predložak, ovaj se znak mora izbjeći:

$ echo "Ovo ^ je test" | awk "/s\^/(ispiši $0)"

Naslovnica ne na početku predloška u awk

Shvatili smo traženje fragmenata teksta koji se nalaze na početku retka. Što ako trebate pronaći nešto na kraju retka?

U tome će nam pomoći znak dolara - $, koji je znak sidra za kraj retka:

$ echo "Ovo je test" | awk "/test$/(ispis $0)"

Pronalaženje teksta na kraju retka

Možete koristiti oba simbola sidra u istom predlošku. Obradimo datoteku myfile, čiji je sadržaj prikazan na slici ispod, koristeći sljedeći regularni izraz:

$ awk "/^ovo je test$/(ispiši $0)" moja datoteka


Uzorak koji koristi posebne znakove za početak i završetak retka

Kao što vidite, predložak je odgovorio samo na redak koji je u potpunosti odgovarao zadanom nizu znakova i njihovom položaju.

Evo kako filtrirati prazne retke pomoću znakova sidra:

$awk "!/^$/(print $0)" moja datoteka
U ovom predlošku koristio sam simbol negacije, uskličnik - ! . Korištenjem ovog uzorka traže se reci koji ne sadrže ništa između početka i kraja retka, a zahvaljujući uskličniku, ispisuju se samo reci koji ne odgovaraju ovom uzorku.

Simbol točke

Točka se koristi za podudaranje bilo kojeg pojedinačnog znaka osim znaka novog retka. Proslijedimo datoteku myfile ovom regularnom izrazu, čiji je sadržaj dan u nastavku:

$awk "/.st/(print $0)" moja datoteka


Korištenje točke u regularnim izrazima

Kao što je vidljivo iz izlaznih podataka, samo prva dva retka iz datoteke odgovaraju uzorku jer sadrže slijed znakova “st” ispred kojeg stoji još jedan znak, dok treći redak ne sadrži odgovarajući niz, a četvrti ga ima, ali je na samom početku retka.

Klase znakova

Točka odgovara bilo kojem pojedinačnom znaku, ali što ako želite biti fleksibilniji u ograničavanju skupa znakova koje tražite? U ovoj situaciji možete koristiti klase znakova.

Zahvaljujući ovom pristupu, možete organizirati potragu za bilo kojim znakom iz zadanog skupa. Za opis klase znakova koriste se uglate zagrade:

$awk "/th/(print $0)" moja datoteka


Opis klase znakova u regularnom izrazu

Ovdje tražimo niz znakova "th" ispred znaka "o" ili znaka "i".

Klase su korisne kada tražite riječi koje mogu započeti velikim ili malim slovom:

$ echo "ovo je test" | awk "/njegov je test/(ispis $0)" $ echo "Ovo je test" | awk "/njegovo je test/(ispiši $0)"

Tražite riječi koje mogu započeti malim ili velikim slovom

Klase znakova nisu ograničene na slova. Ovdje se mogu koristiti i drugi simboli. Nemoguće je unaprijed reći u kojoj će situaciji biti potrebna nastava - sve ovisi o problemu koji se rješava.

Negacija klasa karaktera

Klase znakova također se mogu koristiti za rješavanje inverznog problema koji je gore opisan. Naime, umjesto traženja simbola uključenih u klasu, možete organizirati pretragu svega što nije uključeno u klasu. Kako biste postigli ovakvo ponašanje regularnog izraza, trebate staviti znak ^ ispred popisa znakova klase. Ovako izgleda:

$ awk "/[^oi]th/(print $0)" moja datoteka


Pronalaženje likova koji nisu u klasi

U ovom slučaju, pronaći će se nizovi znakova “th” kojima ne prethodi ni “o” ni “i”.

Rasponi znakova

U klasama znakova možete opisati raspon znakova koristeći crtice:

$awk "/st/(print $0)" moja datoteka


Opis niza znakova u klasi znakova

U ovom primjeru, regularni izraz odgovara nizu znakova "st" ispred kojeg stoji bilo koji znak koji se nalazi, abecednim redom, između znakova "e" i "p".

Rasponi se također mogu kreirati iz brojeva:

$ echo "123" | awk "//" $ echo "12a" | awk "//"

Regularni izraz za pronalaženje bilo koja tri broja

Klasa znakova može uključivati ​​nekoliko raspona:

$awk "/st/(print $0)" moja datoteka


Klasa znakova koja se sastoji od nekoliko raspona

Ovaj regularni izraz će pronaći sve sekvence "st" ispred kojih stoje znakovi iz raspona a-f i m-z.

Klase posebnih znakova

BRE ima posebne klase znakova koje možete koristiti pri pisanju regularnih izraza:
  • [[:alpha:]] - odgovara bilo kojem abecednom znaku, napisanom velikim ili malim slovima.
  • [[:alnum:]] - odgovara bilo kojem alfanumeričkom znaku, odnosno znakovima u rasponu od 0-9, A-Z, a-z.
  • [[:blank:]] - odgovara razmaku i tabulatoru.
  • [[:digit:]] - bilo koja znamenka od 0 do 9.
  • [[:upper:]] - velika slova - A-Z .
  • [[:lower:]] - mala slova - a-z .
  • [[:print:]] - odgovara bilo kojem znaku koji se može ispisati.
  • [[:punct:]] - odgovara interpunkcijskim znakovima.
  • [[:razmak:]] - razmaci, posebno - razmak, tabulator, znakovi NL, FF, VT, CR.
Možete koristiti posebne klase u ovakvim predlošcima:

$ echo "abc" | awk "/[[:alpha:]]/(ispis $0)" $ echo "abc" | awk "/[[:digit:]]/(ispis $0)" $ echo "abc123" | awk "/[[:digit:]]/(ispiši $0)"


Klase posebnih znakova u regularnim izrazima

Simbol zvijezde

Ako stavite zvjezdicu iza znaka u uzorku, to će značiti da će regularni izraz raditi ako se znak pojavi u nizu bilo koji broj puta - uključujući situaciju kada znaka nema u nizu.

$ echo "test" | awk "/tes*t/(ispis $0)" $ echo "tessst" | awk "/tes*t/(ispis $0)"


Korištenje znaka * u regularnim izrazima

Ovaj zamjenski znak obično se koristi za riječi koje se stalno pogrešno pišu ili za riječi koje se pišu drugačije:

$ echo "Volim zelenu boju" | awk "/colou*r/(ispis $0)" $ echo "Sviđa mi se zelena boja " | awk "/boja*r/(ispis $0)"

Pronalaženje riječi s različitim pravopisom

U ovom primjeru, isti regularni izraz odgovara i na riječ "boja" i na riječ "boja". To je tako zbog činjenice da znak "u", nakon kojeg slijedi zvjezdica, može ili biti odsutan ili se pojaviti nekoliko puta zaredom.

Još jedna korisna značajka koja dolazi od simbola zvjezdice je kombiniranje s točkom. Ova kombinacija omogućuje regularnom izrazu da odgovori na bilo koji broj znakova:

$ awk "/this.*test/(print $0)" moja datoteka


Predložak koji odgovara na bilo koji broj znakova

U ovom slučaju nije važno koliko i koji znakovi se nalaze između riječi "ovo" i "test".

Zvjezdica se također može koristiti s klasama znakova:

$ echo "st" | awk "/s*t/(ispis $0)" $ echo "sat" | awk "/s*t/(ispis $0)" $ echo "set" | awk "/s*t/(ispis $0)"


Korištenje zvjezdice s klasama znakova

U sva tri primjera regularni izraz funkcionira jer zvjezdica nakon klase znakova znači da ako se pronađe bilo koji broj znakova "a" ili "e" ili ako se ne pronađe niti jedan, niz će odgovarati zadanom uzorku.

POSIX ERE regularni izrazi

POSIX ERE predlošci koje podržavaju neki Linux uslužni programi mogu sadržavati dodatne znakove. Kao što je već spomenuto, awk podržava ovaj standard, ali sed ne.

Ovdje ćemo pogledati najčešće korištene simbole u ERE obrascima, koji će vam biti od koristi pri stvaranju vlastitih regularnih izraza.

▍Upitnik

Upitnik označava da se prethodni znak može pojaviti jednom ili uopće ne pojaviti u tekstu. Ovaj znak je jedan od metakaraktera koji se ponavljaju. Evo nekoliko primjera:

$ echo "tet" | awk "/tes?t/(print $0)" $ echo "test" | awk "/tes?t/(ispis $0)" $ echo "testst" | awk "/tes?t/(ispis $0)"


Upitnik u regularnim izrazima

Kao što vidite, u trećem slučaju slovo "s" se pojavljuje dva puta, tako da regularni izraz ne odgovara na riječ "testst".

Upitnik se također može koristiti s klasama znakova:

$ echo "tst" | awk "/t?st/(print $0)" $ echo "test" | awk "/t?st/(print $0)" $ echo "tast" | awk "/t?st/(ispis $0)" $ echo "taest" | awk "/t?st/(ispis $0)" $ echo "teest" | awk "/t?st/(ispis $0)"


Upitnik i klase znakova

Ako nema znakova iz klase u retku, ili se jedan od njih pojavljuje jednom, regularni izraz radi, ali čim se u riječi pojave dva znaka, sustav više ne pronalazi podudaranje za uzorak u tekstu.

▍Simbol plus

Znak plus u uzorku označava da će regularni izraz odgovarati onome što traži ako se prethodni znak pojavi jednom ili više puta u tekstu. Međutim, ova konstrukcija neće reagirati na odsutnost simbola:

$ echo "test" | awk "/te+st/(ispis $0)" $ echo "teest" | awk "/te+st/(ispis $0)" $ echo "tst" | awk "/te+st/(ispis $0)"


Simbol plus u regularnim izrazima

U ovom primjeru, ako u riječi nema znaka "e", mehanizam regularnih izraza neće pronaći podudaranja s uzorkom u tekstu. Simbol plus također radi s klasama znakova - na taj je način sličan zvjezdici i upitniku:

$ echo "tst" | awk "/t+st/(print $0)" $ echo "test" | awk "/t+st/(ispis $0)" $ echo "teast" | awk "/t+st/(ispis $0)" $ echo "teeast" | awk "/t+st/(ispis $0)"


Znak plus i klase znakova

U tom slučaju, ako redak sadrži bilo koji znak iz klase, smatrat će se da tekst odgovara uzorku.

▍Vitičaste zagrade

Vitičaste zagrade, koje se mogu koristiti u ERE obrascima, slične su simbolima koji su gore spomenuti, ali vam omogućuju da preciznije odredite potreban broj pojavljivanja simbola koji im prethodi. Ograničenje možete navesti u dva formata:
  • n - broj koji specificira točan broj pretraženih pojavljivanja
  • n, m su dva broja koja se tumače na sljedeći način: "najmanje n puta, ali ne više od m."
Evo primjera prve opcije:

$ echo "tst" | awk "/te(1)st/(print $0)" $ echo "test" | awk "/te(1)st/(print $0)"

Vitičaste zagrade u obrascima, traženje točnog broja pojavljivanja

U starijim verzijama awk-a morali ste koristiti opciju naredbenog retka --re-interval da bi program prepoznao intervale u regularnim izrazima, ali u novijim verzijama to nije potrebno.

$ echo "tst" | awk "/te(1,2)st/(print $0)" $ echo "test" | awk "/te(1,2)st/(ispis $0)" $ echo "teest" | awk "/te(1,2)st/(ispis $0)" $ echo "teeest" | awk "/te(1,2)st/(ispis $0)"


Razmak naveden u vitičastim zagradama

U ovom primjeru, znak "e" mora se pojaviti 1 ili 2 puta u retku, tada će regularni izraz odgovoriti na tekst.

Vitičaste zagrade također se mogu koristiti s klasama znakova. Ovdje se primjenjuju principi koje već poznajete:

$ echo "tst" | awk "/t(1,2)st/(print $0)" $ echo "test" | awk "/t(1,2)st/(ispis $0)" $ echo "teest" | awk "/t(1,2)st/(ispis $0)" $ echo "teeast" | awk "/t(1,2)st/(ispis $0)"


Vitičaste zagrade i klase znakova

Predložak će reagirati na tekst ako jednom ili dvaput sadrži znak “a” ili znak “e”.

▍logički simbol "ili".

Simbol | - okomita crta znači logično "ili" u regularnim izrazima. Prilikom obrade regularnog izraza koji sadrži nekoliko fragmenata odvojenih takvim znakom, motor će smatrati analizirani tekst prikladnim ako se podudara s bilo kojim od fragmenata. Evo primjera:

$ echo "Ovo je test" | awk "/test|ispit/(ispis $0)" $ echo "Ovo je ispit" | awk "/test|ispit/(ispis $0)" $ echo "Ovo je nešto drugo" | awk "/test|ispit/(ispiši $0)"


Logičko "ili" u regularnim izrazima

U ovom primjeru, regularni izraz je konfiguriran za pretraživanje teksta za riječi "test" ili "ispit". Imajte na umu da između fragmenata predloška i simbola koji ih razdvaja | ne bi trebalo biti razmaka.

Fragmenti regularnog izraza mogu se grupirati pomoću zagrada. Ako grupirate određeni niz znakova, sustav će ga percipirati kao običan znak. To jest, na primjer, na njega se mogu primijeniti metaznakovi ponavljanja. Ovako to izgleda:

$ echo "Sviđa mi se" | awk "/Like(Geeks)?/(print $0)" $ echo "LikeGeeks" | awk "/Like(Geeks)?/(print $0)"


Grupiranje fragmenata regularnog izraza

U ovim primjerima, riječ "Geeks" je u zagradama, nakon čega slijedi upitnik. Podsjetimo se da upitnik znači "0 ili 1 ponavljanje", tako da će regularni izraz odgovoriti i na niz "Like" i na niz "LikeGeeks".

Praktični primjeri

Sada kada smo pokrili osnove regularnih izraza, vrijeme je da učinimo nešto korisno s njima.

▍Brojanje broja datoteka

Napišimo bash skriptu koja broji datoteke smještene u direktorijima koji su zapisani u varijablu okruženja PATH. Kako biste to učinili, prvo ćete morati generirati popis staza do direktorija. Učinimo to koristeći sed, zamjenjujući dvotočke razmacima:

$ echo $PATH | sed "s/:/ /g"
Naredba replace podržava regularne izraze kao uzorke za pretraživanje teksta. U ovom slučaju, sve je krajnje jednostavno, tražimo simbol dvotočke, ali nitko nam ne smeta da ovdje koristimo nešto drugo - sve ovisi o konkretnom zadatku.
Sada trebate proći kroz rezultirajući popis u petlji i izvršiti radnje potrebne za brojanje broja datoteka. Opći pregled skripte bit će ovakav:

Mypath=$(echo $PATH | sed "s/:/ /g") za direktorij u $mypath do done
Sada napišimo cijeli tekst skripte, koristeći naredbu ls za dobivanje informacija o broju datoteka u svakom direktoriju:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 za direktorij u $mypath do check=$(ls $directory) za stavku u $check do count=$ [ $count + 1 ] done echo "$directory - $count" count=0 done
Prilikom pokretanja skripte može se ispostaviti da neki direktoriji iz PATH ne postoje, međutim, to ga neće spriječiti da broji datoteke u postojećim direktorijima.


Brojanje datoteka

Glavna vrijednost ovog primjera je da istim pristupom možete riješiti mnogo složenije probleme. Koje točno ovisi o vašim potrebama.

▍Provjera adresa e-pošte

Postoje web stranice s ogromnim zbirkama regularnih izraza koji vam omogućuju provjeru adresa e-pošte, telefonskih brojeva i tako dalje. Međutim, jedna je stvar uzeti nešto gotovo, a nešto sasvim drugo stvoriti nešto sami. Pa napišimo regularni izraz za provjeru adresa e-pošte. Počnimo s analizom izvornih podataka. Evo, na primjer, određene adrese:

[e-mail zaštićen]
Korisničko ime, korisničko ime, može se sastojati od alfanumeričkih i nekih drugih znakova. Naime, ovo je točka, crtica, podvlaka, znak plus. Nakon korisničkog imena slijedi znak @.

Naoružani ovim znanjem, počnimo sastavljati regularni izraz s njegove lijeve strane, koji se koristi za provjeru korisničkog imena. Evo što smo dobili:

^(+)@
Ovaj se regularni izraz može čitati na sljedeći način: "Redak mora započeti barem jednim znakom iz skupine navedenih u uglatim zagradama, nakon čega slijedi znak @."

Sada - red čekanja imena računala - ime računala. Ovdje vrijede ista pravila kao i za korisničko ime, pa će šablon za njega izgledati ovako:

(+)
Naziv vršne domene podliježe posebnim pravilima. Mogu biti samo abecedni znakovi, kojih mora biti najmanje dva (primjerice, takve domene obično sadrže kod zemlje), a ne više od pet. Sve to znači da će predložak za provjeru zadnjeg dijela adrese biti ovakav:

\.({2,5})$
Možete to pročitati ovako: "Prvo mora biti točka, zatim 2 do 5 abecednih znakova, a nakon toga red završava."

Nakon što smo pripremili predloške za pojedinačne dijelove regularnog izraza, sastavimo ih zajedno:

^(+)@(+)\.({2,5})$
Sada preostaje samo testirati što se dogodilo:

$ echo " [e-mail zaštićen]" | awk "/^(+)@(+)\.((2,5))$/(ispis $0)" $ echo " [e-mail zaštićen]" | awk "/^(+)@(+)\.((2,5))$/(ispiši $0)"


Provjera adrese e-pošte korištenjem regularnih izraza

Činjenica da je tekst proslijeđen awk-u prikazan na ekranu znači da ga je sustav prepoznao kao adresu e-pošte.

Rezultati

Ako vam se regularni izraz za provjeru email adresa na koji ste naišli na samom početku članka tada činio potpuno nerazumljivim, nadamo se da sada više ne izgleda kao besmislen skup znakova. Ako je to istina, onda je ovaj materijal ispunio svoju svrhu. Zapravo, regularni izrazi su tema koju možete proučavati cijeli život, ali čak i ono malo što smo obradili već vam može pomoći u pisanju skripti koje prilično napredno obrađuju tekstove.

U ovoj seriji materijala obično smo pokazivali vrlo jednostavne primjere bash skripti koje su se sastojale od doslovno nekoliko redaka. Sljedeći put ćemo pogledati nešto veće.

Poštovani čitatelji! Koristite li regularne izraze pri obradi teksta u skriptama naredbenog retka?

Uobičajeni izraz- tekstualni uzorak koji se sastoji od kombinacije slova, brojeva i posebnih znakova poznatih kao metakarakteri. Bliski srodnici regularnih izraza su zamjenski izrazi, koji se često koriste u upravljanju datotekama. Regularni izrazi uglavnom se koriste za usporedbu i pretraživanje teksta. Naširoko se koristi za raščlanjivanje sintakse.

Korisnici UNIX-a upoznati su s regularnim izrazima iz grep, sed, awk (ili gawk) i ed. Koristeći ove programe ili njihove analoge, možete isprobati i provjeriti primjere u nastavku. Uređivači teksta kao što su (X)Emacs i vi također često koriste regularne izraze. Možda se najpoznatija i najraširenija uporaba regularnih izraza događa u jeziku Perl. Programerima softvera i administratorima sustava teško je bez poznavanja regularnih izraza.

Metakarakteri

Dakle, nizovi se mogu sastojati od slova, brojeva i metakaraktera. Metaznakovi su:

\ | () { } ^ $ * + ? . < >

Metaznakovi mogu imati sljedeće uloge u regularnom izrazu:

    kvantifikator

    izjava;

    grupni znak;

    alternativa;

    znak niza

Kvantifikatori

Metaznak * (zvjezdica) zamjenjuje 0 ili više znakova. Metaznak + (plus) zamjenjuje 1 ili više znakova. metakarakter. (točka) zamjenjuje točno 1 proizvoljni znak. metakarakter? (upitnik) zamjenjuje 0 ili 1 znak. Razlika u korištenju * i + je takva da će upit za niz c* vratiti sve nizove, uključujući prazne, dok će upit sa c+ vratiti samo nizove koji sadrže znak c.

Prazni redovi poštuju sljedeće konvencije: prazan redak sadrži jedan i samo jedan prazan redak; u nepraznom nizu prazni reci nalaze se prije svakog znaka i također na kraju retka.

Regularni izrazi također koriste (n,m) konstrukciju, što znači da se znak koji prethodi konstrukciji pojavljuje n do m puta u retku. Izostavljanjem broja m mislimo na beskonačnost. Oni. posebni slučajevi konstrukcije su sljedeći unosi: (0,) , (1,) i (0,1) . Prvi odgovara *, drugi odgovara + metakarakteru, a treći odgovara ? . Ove se jednakosti lako mogu dobiti iz definicije odgovarajućih kvantifikatora. Osim toga, konstrukcija (n) znači da se simbol pojavljuje točno n puta.

U vezi s upotrebom nekih interpunkcijskih znakova i matematičkih simbola kao metaznakova, uveden je dodatni metaznak \ (obrnuta kosa crta), koji, kada se napiše ispred metaznaka, pretvara potonji u uobičajeni znak. Oni. ? je kvantifikator, a \? - upitnik.

grupe

Gore opisani kvantifikatori, kao što je već spomenuto, djeluju na simbol koji im je najbliži s lijeve strane (posljednji prethodni). Ali ovo ograničenje mogu zaobići grupe koje koriste metaznakove (i) u svojim oznakama. Ovi simboli izoliraju podizraz od izraza, koji se kombinira u grupu, na koju se zatim primjenjuje kvantifikator.

Primjer:

znači (ili zamjenjuje)

Ho ho ho ho ho ho hohoho

Moguća su ugniježđivanja podizraza, tj. Podizrazi kraće duljine mogu se izdvojiti iz podizraza.

Alternative

Formirano pomoću metasimbola | (okomita crta) koja označava logično "ili".

Primjer: regularni izraz krave(a|s|e|y|oh|oh)? navodi sve moguće fleksije riječi "krava" u jednini po padežima.

Izjave

Identificiraju se metaznakovi koji označavaju posebne objekte - linije nulte duljine koje služe za određivanje mjesta teksta koji im prethodi ili slijedi. Takvi se objekti nazivaju tvrdnjama. U regularnim izrazima postoje sljedeće izjave:

^ početak retka $ kraj retka< начало слова >kraj riječi

Primjer: Regularni izraz $The odgovara nizu koji počinje s The .

Napomena: Obični znakovi mogu se tretirati kao izjave s duljinom različitom od nule.

Nizovi

Posebna konstrukcija zatvorena metaznakovima [ i ] (pravokutne zagrade) omogućuje popis varijanti znakova koji se mogu pojaviti u regularnom izrazu na danom mjestu, a naziva se niz. Unutar pravokutnih zagrada, svi metakarakteri se tretiraju kao jednostavni znakovi, a simboli - (minus) i ^ poprimaju nova značenja: prvi vam omogućuje da odredite kontinuirani niz znakova između dva navedena, a drugi daje logično "ne ” (negacija). Najlakše je razmotriti sljedeće primjere:

bilo koje od malih latiničnih slova:

Latinski alfanumerički znak (od a do z, od A do Z i od 0 do 9):

nelatinični alfanumerički znak:

[^a-zA-Z0-9]

bilo koja riječ (bez crtica, matematičkih simbola i brojeva):

<+>

Radi sažetosti i jednostavnosti uvode se sljedeće kratice:

\d znamenka (tj. odgovara izrazu); \D nije znamenka (tj. [^0-9]); \w latinska riječ (alfanumerička); \W je niz znakova bez razmaka koji nije latinična alfanumerička riječ ([^a-zA-Z0-9]); \s prazan prostor [ \t\n\r\f] , tj. razmaci, kartice itd. \S neprazan interval ([^ \t\n\r\f]).

Odnos sa zamjenskim znakovima

Vjerojatno je svaki korisnik upoznat sa zamjenskim znakovima. Primjer zamjenskog izraza je *.jpg, koji predstavlja sve datoteke s nastavkom jpg. Kako se regularni izrazi razlikuju od zamjenskih znakova? Razlike se mogu sažeti u tri pravila za pretvaranje proizvoljnog izraza sa zamjenskim znakovima u regularni izraz:

    Zamijenjen sa.*

    Zamijeniti? na.

    Zamijenite sve znakove koji odgovaraju metaznakovima njihovim verzijama s kosom crtom.

Doista, u regularnom izrazu, unos * je beskoristan i proizvodi prazan niz, jer znači da se prazna linija ponavlja onoliko puta koliko želite. Ali * (ponovite proizvoljni simbol koliko god puta želite, uključujući 0) točno se poklapa u značenju sa simbolom * u skupu zamjenskih znakova.

Regularni izraz koji odgovara *.jpg izgledao bi ovako: .*\.jpg . I, na primjer, niz zamjenskih znakova ez*.pp odgovara dvama ekvivalentnim regularnim izrazima - ez.*\.pp i ez.*\.(cpp|hpp) .

Primjeri regularnih izraza

Format e-pošte [e-mail zaštićen]

+(\.+)*@+(\.+)+

E-mail u formatu "Ivan Ivanov "

("?+"?[ \t]*)+\<+(\.+)*@+(\.+)+\>

Provjera web protokola u URL-u (http://, ftp:// ili https://)

+://

Neke C/C++ naredbe i direktive:

^#uključi[ \t]+[<"][^>"]+[">] - uključi direktivu

//.+$ - komentar u jednom redu

/\*[^*]*\*/ - komentar na nekoliko redaka

-?+\.+ - broj s pomičnim zarezom

0x+ je broj u heksadecimalnom brojevnom sustavu.

A evo, na primjer, programa za traženje riječi krava:

grep -E "cow|vache" * >/ dev/ null && echo "Pronašao sam kravu"

Ovdje se opcija -E koristi za omogućavanje podrške za proširenu sintaksu regularnog izraza.

Tekst se temelji na članku Jana Borsodija iz datoteke HOWTO-regexps.htm

Kako biste u potpunosti obradili tekstove u bash skriptama koristeći sed i awk, samo trebate razumjeti regularne izraze. Implementacije ovog najkorisnijeg alata mogu se pronaći doslovno posvuda, a iako su svi regularni izrazi strukturirani na sličan način i temelje se na istim idejama, rad s njima u različitim okruženjima ima određene značajke. Ovdje ćemo govoriti o regularnim izrazima koji su prikladni za korištenje u skriptama naredbenog retka Linuxa.

Ovaj materijal je zamišljen kao uvod u regularne izraze, namijenjen onima koji možda uopće nisu svjesni što oni jesu. Pa krenimo od samog početka.

Što su regularni izrazi

Mnogi ljudi, kada prvi put vide regularne izraze, odmah pomisle da gledaju besmislenu zbrku znakova. Ali to je, naravno, daleko od slučaja. Na primjer, pogledajte ovaj regularni izraz

Po našem mišljenju, čak će i apsolutni početnik odmah shvatiti kako radi i zašto je potreban :) Ako vam nije sasvim jasno, samo čitajte dalje i sve će doći na svoje mjesto.
Regularni izraz je uzorak koji programi kao što su sed ili awk koriste za filtriranje teksta. Predlošci koriste obične ASCII znakove koji predstavljaju sami sebe i takozvane metaznakove koji imaju posebnu ulogu, na primjer, omogućujući vam da se referirate na određene grupe znakova.

Vrste regularnih izraza

Implementacije regularnih izraza u različitim okruženjima, na primjer, u programskim jezicima kao što su Java, Perl i Python, te u Linux alatima kao što su sed, awk i grep, imaju određene značajke. Ove značajke ovise o takozvanim regularnim izrazima, koji tumače uzorke.
Linux ima dva mehanizma regularnih izraza:

  • Motor koji podržava standard POSIX Basic Regular Expression (BRE).
  • Motor koji podržava standard POSIX Extended Regular Expression (ERE).

Većina uslužnih programa za Linux usklađena je barem s POSIX BRE standardom, ali neki uslužni programi (uključujući sed) razumiju samo podskup BRE standarda. Jedan od razloga za ovo ograničenje je želja da se takvi uslužni programi učine što bržim u obradi teksta.

POSIX ERE standard često se implementira u programske jezike. Omogućuje vam korištenje velikog broja alata pri razvoju regularnih izraza. Na primjer, to mogu biti posebni nizovi znakova za često korištene obrasce, kao što je traženje pojedinačnih riječi ili skupova brojeva u tekstu. Awk podržava ERE standard.

Postoji mnogo načina za razvoj regularnih izraza, ovisno o mišljenju programera i značajkama motora za koji su stvoreni. Nije lako napisati univerzalne regularne izraze koje svaki stroj može razumjeti. Stoga ćemo se usredotočiti na najčešće korištene regularne izraze i pogledati značajke njihove implementacije za sed i awk.

POSIX BRE regularni izrazi

Možda je najjednostavniji BRE obrazac regularni izraz za traženje točnog pojavljivanja niza znakova u tekstu. Ovako izgleda traženje niza u sed-u i awk-u:

$ echo "Ovo je test" | sed -n "/test/p" $ echo "Ovo je test" | awk "/test/(ispiši $0)"

Traženje teksta prema uzorku u sed-u

Traženje teksta prema uzorku u awk

Možda ćete primijetiti da se traženje zadanog uzorka izvodi bez uzimanja u obzir točne lokacije teksta u retku. Osim toga, broj pojavljivanja nije bitan. Nakon što regularni izraz pronađe navedeni tekst bilo gdje u nizu, niz se smatra prikladnim i prosljeđuje se na daljnju obradu.

Kada radite s regularnim izrazima, morate uzeti u obzir da su osjetljivi na velika i mala slova:

$ echo "Ovo je test" | awk "/Test/(ispis $0)" $ echo "Ovo je test" | awk "/test/(ispiši $0)"

Regularni izrazi razlikuju velika i mala slova

Prvi regularni izraz nije pronašao nijedno podudaranje jer se riječ "test", koja počinje velikim slovom, ne pojavljuje u tekstu. Drugi, konfiguriran za traženje riječi napisane velikim slovima, pronašao je odgovarajući redak u toku.

U regularnim izrazima možete koristiti ne samo slova, već i razmake i brojeve:

$ echo "Ovo je opet test 2" | awk "/test 2/(ispiši $0)"

Pronalaženje dijela teksta koji sadrži razmake i brojeve

Razmaci se tretiraju kao regularni znakovi od strane regularnog izraza.

Posebni simboli

Kada koristite različite znakove u regularnim izrazima, morate uzeti u obzir neke stvari. Dakle, postoje neki posebni znakovi, ili metaznakovi, čija upotreba u predlošku zahtijeva poseban pristup. Evo ih:

.*^${}+?|()

Ako je jedan od njih potreban u predlošku, trebat će ga izbjeći pomoću obrnute kose crte (obrnute kose crte) - .

Na primjer, ako trebate pronaći znak dolara u tekstu, morate ga uključiti u predložak, a ispred njega treba staviti znak za izlaz. Recimo da postoji datoteka myfile sa sljedećim tekstom:

Imam 10 dolara u džepu

Znak dolara može se otkriti pomoću ovog uzorka:

$awk "/$/(ispis $0)" moja datoteka

Korištenje posebnog znaka u uzorku

Osim toga, obrnuta kosa crta također je poseban znak, pa ako je trebate upotrijebiti u uzorku, morat ćete je izbjeći. Izgleda kao dvije kose crte koje slijede jedna za drugom:

$ echo "je poseban znak" | awk "/\/(ispiši $0)"

Izbjegavanje obrnute kose crte

Iako kosa crta nije uključena u gornji popis posebnih znakova, pokušaj njezine upotrebe u regularnom izrazu napisanom za sed ili awk rezultirat će pogreškom:

Netočna upotreba kose crte u uzorku

Ako je potrebno, mora se i izbjeći:

$ echo "3 / 2" | awk "///(ispiši $0)"

Izbjegavanje kose crte

Simboli sidra

Postoje dva posebna znaka za povezivanje uzorka s početkom ili krajem tekstualnog niza. Znak cap - ^ omogućuje vam da opišete nizove znakova koji se nalaze na početku redaka teksta. Ako je uzorak koji tražite negdje drugdje u nizu, regularni izraz neće odgovoriti na njega. Upotreba ovog simbola izgleda ovako:

$ echo "dobrodošli na likegeeks web stranicu" | awk "/^likegeeks/(print $0)" $ echo "likegeeks web stranica" | awk "/^likegeeks/(ispiši $0)"

Pronalaženje uzorka na početku niza

Znak ^ je dizajniran za traženje uzorka na početku retka, dok se velika i velika slova također uzimaju u obzir. Pogledajmo kako to utječe na obradu tekstualne datoteke:

$awk "/^ovo/(ispiši $0)" moja datoteka


Pronalaženje uzorka na početku retka u tekstu iz datoteke

Kada koristite sed, ako postavite kapu negdje unutar uzorka, ona će se tretirati kao bilo koji drugi uobičajeni znak:

$ echo "Ovo ^ je test" | sed -n "/s ^/p"

Kapica nije na početku uzorka u sed-u

U awk-u, kada koristite isti predložak, ovaj se znak mora izbjeći:

$ echo "Ovo ^ je test" | awk "/s ^/(ispiši $0)"

Naslovnica ne na početku predloška u awk

Shvatili smo traženje fragmenata teksta koji se nalaze na početku retka. Što ako trebate pronaći nešto na kraju retka?

U tome će nam pomoći znak dolara - $, koji je znak sidra za kraj retka:

$ echo "Ovo je test" | awk "/test$/(ispis $0)"

Pronalaženje teksta na kraju retka

Možete koristiti oba simbola sidra u istom predlošku. Obradimo datoteku myfile, čiji je sadržaj prikazan na slici ispod, koristeći sljedeći regularni izraz:

$ awk "/^ovo je test$/(ispiši $0)" moja datoteka


Uzorak koji koristi posebne znakove za početak i završetak retka

Kao što vidite, predložak je odgovorio samo na redak koji je u potpunosti odgovarao zadanom nizu znakova i njihovom položaju.

Evo kako filtrirati prazne retke pomoću znakova sidra:

$awk "!/^$/(print $0)" moja datoteka

U ovom predlošku koristio sam simbol negacije, uskličnik - ! . Korištenjem ovog uzorka traže se reci koji ne sadrže ništa između početka i kraja retka, a zahvaljujući uskličniku, ispisuju se samo reci koji ne odgovaraju ovom uzorku.

Simbol točke

Točka se koristi za podudaranje bilo kojeg pojedinačnog znaka osim znaka novog retka. Proslijedimo datoteku myfile ovom regularnom izrazu, čiji je sadržaj dan u nastavku:

$awk "/.st/(print $0)" moja datoteka


Korištenje točke u regularnim izrazima

Kao što je vidljivo iz izlaznih podataka, samo prva dva retka iz datoteke odgovaraju uzorku jer sadrže slijed znakova “st” ispred kojeg stoji još jedan znak, dok treći redak ne sadrži odgovarajući niz, a četvrti ga ima, ali je na samom početku retka.

Klase znakova

Točka odgovara bilo kojem pojedinačnom znaku, ali što ako želite biti fleksibilniji u ograničavanju skupa znakova koje tražite? U ovoj situaciji možete koristiti klase znakova.

Zahvaljujući ovom pristupu, možete organizirati potragu za bilo kojim znakom iz zadanog skupa. Za opis klase znakova koriste se uglate zagrade:

$awk "/th/(print $0)" moja datoteka


Opis klase znakova u regularnom izrazu

Ovdje tražimo niz znakova "th" ispred znaka "o" ili znaka "i".

Klase su korisne kada tražite riječi koje mogu započeti velikim ili malim slovom:

$ echo "ovo je test" | awk "/njegov je test/(ispis $0)" $ echo "Ovo je test" | awk "/njegovo je test/(ispiši $0)"

Tražite riječi koje mogu započeti malim ili velikim slovom

Klase znakova nisu ograničene na slova. Ovdje se mogu koristiti i drugi simboli. Nemoguće je unaprijed reći u kojoj će situaciji biti potrebna nastava - sve ovisi o problemu koji se rješava.

Negacija klasa karaktera

Klase znakova također se mogu koristiti za rješavanje inverznog problema koji je gore opisan. Naime, umjesto traženja simbola uključenih u klasu, možete organizirati pretragu svega što nije uključeno u klasu. Kako biste postigli ovakvo ponašanje regularnog izraza, trebate staviti znak ^ ispred popisa znakova klase. Ovako izgleda:

$ awk "/[^oi]th/(print $0)" moja datoteka


Pronalaženje likova koji nisu u klasi

U ovom slučaju, pronaći će se nizovi znakova “th” kojima ne prethodi ni “o” ni “i”.

Rasponi znakova

U klasama znakova možete opisati raspon znakova koristeći crtice:

$awk "/st/(print $0)" moja datoteka


Opis niza znakova u klasi znakova

U ovom primjeru, regularni izraz odgovara nizu znakova "st" ispred kojeg stoji bilo koji znak koji se nalazi, abecednim redom, između znakova "e" i "p".

Rasponi se također mogu kreirati iz brojeva:

$ echo "123" | awk "//" $ echo "12a" | awk "//"

Regularni izraz za pronalaženje bilo koja tri broja

Klasa znakova može uključivati ​​nekoliko raspona:

$awk "/st/(print $0)" moja datoteka


Klasa znakova koja se sastoji od nekoliko raspona

Ovaj regularni izraz će pronaći sve sekvence "st" ispred kojih stoje znakovi iz raspona a-f i m-z.

Klase posebnih znakova

BRE ima posebne klase znakova koje možete koristiti pri pisanju regularnih izraza:

  • [[:alpha:]] - odgovara bilo kojem abecednom znaku, napisanom velikim ili malim slovima.
  • [[:alnum:]] - odgovara bilo kojem alfanumeričkom znaku, odnosno znakovima u rasponu od 0-9, A-Z, a-z.
  • [[:blank:]] - odgovara razmaku i tabulatoru.
  • [[:digit:]] - bilo koja znamenka od 0 do 9.
  • [[:upper:]] - velika slova - A-Z .
  • [[:lower:]] - mala slova - a-z .
  • [[:print:]] - odgovara bilo kojem znaku koji se može ispisati.
  • [[:punct:]] - odgovara interpunkcijskim znakovima.
  • [[:razmak:]] - razmaci, posebno - razmak, tabulator, znakovi NL, FF, VT, CR.

Možete koristiti posebne klase u ovakvim predlošcima:

$ echo "abc" | awk "/[[:alpha:]]/(ispis $0)" $ echo "abc" | awk "/[[:digit:]]/(ispis $0)" $ echo "abc123" | awk "/[[:digit:]]/(ispiši $0)"


Klase posebnih znakova u regularnim izrazima

Simbol zvijezde

Ako stavite zvjezdicu iza znaka u uzorku, to će značiti da će regularni izraz raditi ako se znak pojavi u nizu bilo koji broj puta - uključujući situaciju kada znaka nema u nizu.

$ echo "test" | awk "/tes*t/(ispis $0)" $ echo "tessst" | awk "/tes*t/(ispis $0)"


Korištenje znaka * u regularnim izrazima

Ovaj zamjenski znak obično se koristi za riječi koje se stalno pogrešno pišu ili za riječi koje se pišu drugačije:

$ echo "Volim zelenu boju" | awk "/colou*r/(ispis $0)" $ echo "Sviđa mi se zelena boja " | awk "/boja*r/(ispis $0)"

Pronalaženje riječi s različitim pravopisom

U ovom primjeru, isti regularni izraz odgovara i na riječ "boja" i na riječ "boja". To je tako zbog činjenice da znak "u", nakon kojeg slijedi zvjezdica, može ili biti odsutan ili se pojaviti nekoliko puta zaredom.

Još jedna korisna značajka koja dolazi od simbola zvjezdice je kombiniranje s točkom. Ova kombinacija omogućuje regularnom izrazu da odgovori na bilo koji broj znakova:

$ awk "/this.*test/(print $0)" moja datoteka


Predložak koji odgovara na bilo koji broj znakova

U ovom slučaju nije važno koliko i koji znakovi se nalaze između riječi "ovo" i "test".

Zvjezdica se također može koristiti s klasama znakova:

$ echo "st" | awk "/s*t/(ispis $0)" $ echo "sat" | awk "/s*t/(ispis $0)" $ echo "set" | awk "/s*t/(ispis $0)"


Korištenje zvjezdice s klasama znakova

U sva tri primjera regularni izraz funkcionira jer zvjezdica nakon klase znakova znači da ako se pronađe bilo koji broj znakova "a" ili "e" ili ako se ne pronađe niti jedan, niz će odgovarati zadanom uzorku.

POSIX ERE regularni izrazi

POSIX ERE predlošci koje podržavaju neki Linux uslužni programi mogu sadržavati dodatne znakove. Kao što je već spomenuto, awk podržava ovaj standard, ali sed ne.

Ovdje ćemo pogledati najčešće korištene simbole u ERE obrascima, koji će vam biti od koristi pri stvaranju vlastitih regularnih izraza.

▍Upitnik

Upitnik označava da se prethodni znak može pojaviti jednom ili uopće ne pojaviti u tekstu. Ovaj znak je jedan od metakaraktera koji se ponavljaju. Evo nekoliko primjera:

$ echo "tet" | awk "/tes?t/(print $0)" $ echo "test" | awk "/tes?t/(ispis $0)" $ echo "testst" | awk "/tes?t/(ispis $0)"


Upitnik u regularnim izrazima

Kao što vidite, u trećem slučaju slovo "s" se pojavljuje dva puta, tako da regularni izraz ne odgovara na riječ "testst".

Upitnik se također može koristiti s klasama znakova:

$ echo "tst" | awk "/t?st/(print $0)" $ echo "test" | awk "/t?st/(print $0)" $ echo "tast" | awk "/t?st/(ispis $0)" $ echo "taest" | awk "/t?st/(ispis $0)" $ echo "teest" | awk "/t?st/(ispis $0)"


Upitnik i klase znakova

Ako nema znakova iz klase u retku, ili se jedan od njih pojavljuje jednom, regularni izraz radi, ali čim se u riječi pojave dva znaka, sustav više ne pronalazi podudaranje za uzorak u tekstu.

▍Simbol plus

Znak plus u uzorku označava da će regularni izraz odgovarati onome što traži ako se prethodni znak pojavi jednom ili više puta u tekstu. Međutim, ova konstrukcija neće reagirati na odsutnost simbola:

$ echo "test" | awk "/te+st/(ispis $0)" $ echo "teest" | awk "/te+st/(ispis $0)" $ echo "tst" | awk "/te+st/(ispis $0)"


Simbol plus u regularnim izrazima

U ovom primjeru, ako u riječi nema znaka "e", mehanizam regularnih izraza neće pronaći podudaranja s uzorkom u tekstu. Simbol plus također radi s klasama znakova - na taj je način sličan zvjezdici i upitniku:

$ echo "tst" | awk "/t+st/(print $0)" $ echo "test" | awk "/t+st/(ispis $0)" $ echo "teast" | awk "/t+st/(ispis $0)" $ echo "teeast" | awk "/t+st/(ispis $0)"


Znak plus i klase znakova

U tom slučaju, ako redak sadrži bilo koji znak iz klase, smatrat će se da tekst odgovara uzorku.

▍Vitičaste zagrade

Vitičaste zagrade, koje se mogu koristiti u ERE obrascima, slične su simbolima koji su gore spomenuti, ali vam omogućuju da preciznije odredite potreban broj pojavljivanja simbola koji im prethodi. Ograničenje možete navesti u dva formata:

  • n - broj koji specificira točan broj pretraženih pojavljivanja
  • n, m su dva broja koja se tumače na sljedeći način: "najmanje n puta, ali ne više od m."

Evo primjera prve opcije:

$ echo "tst" | awk "/te(1)st/(print $0)" $ echo "test" | awk "/te(1)st/(print $0)"

Vitičaste zagrade u obrascima, traženje točnog broja pojavljivanja

U starijim verzijama awk-a morali ste koristiti opciju naredbenog retka --re-interval da bi program prepoznao intervale u regularnim izrazima, ali u novijim verzijama to nije potrebno.

$ echo "tst" | awk "/te(1,2)st/(print $0)" $ echo "test" | awk "/te(1,2)st/(ispis $0)" $ echo "teest" | awk "/te(1,2)st/(ispis $0)" $ echo "teeest" | awk "/te(1,2)st/(ispis $0)"


Razmak naveden u vitičastim zagradama

U ovom primjeru, znak "e" mora se pojaviti 1 ili 2 puta u retku, tada će regularni izraz odgovoriti na tekst.

Vitičaste zagrade također se mogu koristiti s klasama znakova. Ovdje se primjenjuju principi koje već poznajete:

$ echo "tst" | awk "/t(1,2)st/(print $0)" $ echo "test" | awk "/t(1,2)st/(ispis $0)" $ echo "teest" | awk "/t(1,2)st/(ispis $0)" $ echo "teeast" | awk "/t(1,2)st/(ispis $0)"


Vitičaste zagrade i klase znakova

Predložak će reagirati na tekst ako jednom ili dvaput sadrži znak “a” ili znak “e”.

▍logički simbol "ili".

Simbol | - okomita crta znači logično "ili" u regularnim izrazima. Prilikom obrade regularnog izraza koji sadrži nekoliko fragmenata odvojenih takvim znakom, motor će smatrati analizirani tekst prikladnim ako se podudara s bilo kojim od fragmenata. Evo primjera:

$ echo "Ovo je test" | awk "/test|ispit/(ispis $0)" $ echo "Ovo je ispit" | awk "/test|ispit/(ispis $0)" $ echo "Ovo je nešto drugo" | awk "/test|ispit/(ispiši $0)"


Logičko "ili" u regularnim izrazima

U ovom primjeru, regularni izraz je konfiguriran za pretraživanje teksta za riječi "test" ili "ispit". Imajte na umu da između fragmenata predloška i simbola koji ih razdvaja | ne bi trebalo biti razmaka.

Fragmenti regularnog izraza mogu se grupirati pomoću zagrada. Ako grupirate određeni niz znakova, sustav će ga percipirati kao običan znak. To jest, na primjer, na njega se mogu primijeniti metaznakovi ponavljanja. Ovako to izgleda:

$ echo "Sviđa mi se" | awk "/Like(Geeks)?/(print $0)" $ echo "LikeGeeks" | awk "/Like(Geeks)?/(print $0)"


Grupiranje fragmenata regularnog izraza

U ovim primjerima, riječ "Geeks" je u zagradama, nakon čega slijedi upitnik. Podsjetimo se da upitnik znači "0 ili 1 ponavljanje", tako da će regularni izraz odgovoriti i na niz "Like" i na niz "LikeGeeks".

Praktični primjeri

Sada kada smo pokrili osnove regularnih izraza, vrijeme je da učinimo nešto korisno s njima.

▍Brojanje broja datoteka

Napišimo bash skriptu koja broji datoteke smještene u direktorijima koji su zapisani u varijablu okruženja PATH. Kako biste to učinili, prvo ćete morati generirati popis staza do direktorija. Učinimo to koristeći sed, zamjenjujući dvotočke razmacima:

$ echo $PATH | sed "s/:/ /g"

Naredba replace podržava regularne izraze kao uzorke za pretraživanje teksta. U ovom slučaju, sve je krajnje jednostavno, tražimo simbol dvotočke, ali nitko nam ne smeta da ovdje koristimo nešto drugo - sve ovisi o konkretnom zadatku.
Sada trebate proći kroz rezultirajući popis u petlji i izvršiti radnje potrebne za brojanje broja datoteka. Opći pregled skripte bit će ovakav:

Mypath=$(echo $PATH | sed "s/:/ /g") za direktorij u $mypath do done

Sada napišimo cijeli tekst skripte, koristeći naredbu ls za dobivanje informacija o broju datoteka u svakom direktoriju:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 za direktorij u $mypath do check=$(ls $directory) za stavku u $check do count=$ [ $count + 1 ] done echo "$directory - $count" count=0 done

Prilikom pokretanja skripte može se ispostaviti da neki direktoriji iz PATH ne postoje, međutim, to ga neće spriječiti da broji datoteke u postojećim direktorijima.


Brojanje datoteka

Glavna vrijednost ovog primjera je da istim pristupom možete riješiti mnogo složenije probleme. Koje točno ovisi o vašim potrebama.

▍Provjera adresa e-pošte

Postoje web stranice s ogromnim zbirkama regularnih izraza koji vam omogućuju provjeru adresa e-pošte, telefonskih brojeva i tako dalje. Međutim, jedna je stvar uzeti nešto gotovo, a nešto sasvim drugo stvoriti nešto sami. Dakle, napišimo regularni izraz za provjeru adresa e-pošte. Počnimo s analizom izvornih podataka. Evo, na primjer, određene adrese:

[e-mail zaštićen]

Korisničko ime, korisničko ime, može se sastojati od alfanumeričkih i nekih drugih znakova. Naime, ovo je točka, crtica, podvlaka, znak plus. Nakon korisničkog imena slijedi znak @.

Naoružani ovim znanjem, počnimo sastavljati regularni izraz s njegove lijeve strane, koji se koristi za provjeru korisničkog imena. Evo što smo dobili:

^(+)@

Sada - red čekanja imena računala - ime računala. Ovdje vrijede ista pravila kao i za korisničko ime, pa će šablon za njega izgledati ovako:

(+)

Naziv vršne domene podliježe posebnim pravilima. Mogu biti samo abecedni znakovi, kojih mora biti najmanje dva (primjerice, takve domene obično sadrže kod zemlje), a ne više od pet. Sve to znači da će predložak za provjeru zadnjeg dijela adrese biti ovakav:

.({2,5})$

Možete to pročitati ovako: "Prvo mora biti točka, zatim 2 do 5 abecednih znakova, a nakon toga red završava."

Nakon što smo pripremili predloške za pojedinačne dijelove regularnog izraza, sastavimo ih zajedno:

^(+)@(+).({2,5})$

Sada preostaje samo testirati što se dogodilo:

$ echo " [e-mail zaštićen]" | awk "/^(+)@(+).((2,5))$/(ispis $0)" $ echo " [e-mail zaštićen]" | awk "/^(+)@(+).((2,5))$/(ispiši $0)"


Provjera adrese e-pošte korištenjem regularnih izraza

Činjenica da je tekst proslijeđen awk-u prikazan na ekranu znači da ga je sustav prepoznao kao adresu e-pošte.

Rezultati

Ako vam se regularni izraz za provjeru email adresa na koji ste naišli na samom početku članka tada činio potpuno nerazumljivim, nadamo se da sada više ne izgleda kao besmislen skup znakova. Ako je to istina, onda je ovaj materijal ispunio svoju svrhu. Zapravo, regularni izrazi su tema koju možete proučavati cijeli život, ali čak i ono malo što smo obradili već vam može pomoći u pisanju skripti koje prilično napredno obrađuju tekstove.

U ovoj seriji materijala obično smo pokazivali vrlo jednostavne primjere bash skripti koje su se sastojale od doslovno nekoliko redaka. Sljedeći put ćemo pogledati nešto veće.

Poštovani čitatelji! Koristite li regularne izraze pri obradi teksta u skriptama naredbenog retka?

Dobar dan, gosti!

U današnjem članku želim se dotaknuti tako velike teme kao što je Regularni izrazi. Mislim da svi znaju da je tema regularnih izraza (kako se regularni izrazi zovu u slengu) ogromna u opsegu jednog posta. Stoga ću pokušati ukratko, ali što jasnije sabrati svoja razmišljanja i prenijeti vam ih u .

Dopustite mi da počnem tako što ću reći da postoji nekoliko vrsta regularnih izraza:

1. Tradicionalni regularni izrazi(oni su također osnovni, osnovni i osnovni regularni izrazi(BRE))

  • Sintaksa ovih izraza je definirana kao zastarjela, ali je unatoč tome još uvijek široko rasprostranjena i koristi je u mnogim UNIX uslužnim programima
  • Osnovni regularni izrazi uključuju sljedeće metakaraktere (više o njihovim značenjima u nastavku):
    • \( \) - početna verzija za ( ) (u proširenom)
    • \(\) - početna verzija za () (u proširenom)
    • \n, Gdje n- brojevi od 1 do 9
  • Značajke korištenja ovih metakaraktera:
    • Zvjezdica mora slijediti izraz koji odgovara jednom znaku. Primjer: *.
    • Izraz \( blok\)* treba smatrati netočnim. U nekim slučajevima odgovara nula ili više ponavljanja niza blok. U drugima odgovara nizu blok* .
    • Unutar klase znakova, značenja posebnih znakova uglavnom se zanemaruju. Posebni slučajevi:
    • Da biste dodali znak ^ skupu, on ne smije biti prvi tamo.
    • Da biste dodali znak - u skup, on mora biti tamo prvi ili zadnji. Na primjer:
      • DNS predložak imena, koji može sadržavati slova, brojeve, minus i točku: [-0-9a-zA-Z.] ;
      • bilo koji znak osim minusa i brojeva: [^-0-9] .
    • Da biste dodali znak [ ili ] skupu, prvo ga morate tamo postaviti. Na primjer:
      • odgovara ], [, a ili b.

2. Napredni regularni izrazi(oni su prošireni regularni izrazi(ERE))

  • Sintaksa ovih izraza slična je sintaksi glavnih izraza, s izuzetkom:
    • Uklonjena je upotreba obrnutih kosih crta za metaznakove ( ) i ().
    • Obrnuta kosa crta prije metaznaka nadjačava njegovo posebno značenje.
    • Teoretski odbijeno neregularan oblikovati\ n .
    • Dodani metaznakovi + , ? , | .

3. Regularni izrazi kompatibilni s Perlom(oni su Perl-kompatibilni regularni izrazi(PCRE))

  • imaju bogatiju i istovremeno predvidljivu sintaksu čak i od POSIX ERE, pa ih aplikacije često koriste.

Regularni izrazi Sastoji se odšablone, odnosno postaviti predložak traži. Predložak se sastoji iz pravila pretrage, koje se sastoje od likovi I metaznakovi.

Pravila pretraživanja određuju se sljedećim operacije:

Nabrajanje |

Cijev (|) razdvaja valjane opcije, moglo bi se reći - logično ILI. Na primjer, "sivo|sivo" odgovara siva ili siva.

Grupa ili unija()

Okrugle zagrade koriste se za definiranje opsega i prvenstva operatora. Na primjer, "sivo|sivo" i "gr(a|e)y" su različiti uzorci, ali oba opisuju skup koji sadrži siva I siva.

Kvantificiraj()? * +

Kvantifikator nakon što lik ili grupa odredi koliko puta prethodnik može doći do izražaja.

opći izraz, ponavljanja mogu biti od m do n uključivo.

opći izraz m ili više ponavljanja.

opći izraz ne više od n ponavljanja.

glatko, nesmetanon ponavljanja.

Upitnik sredstva 0 ili 1 puta, isto kao {0,1} . Na primjer, "colou?r" odgovara i boja, I boja.

Zvijezda sredstva 0, 1 ili bilo koji broj jednom ( {0,} ). Na primjer, "go*gle" odgovara ggle, Google, google i tako dalje.

Plus sredstva najmanje 1 jednom ( {1,} ). Na primjer, "go+gle" odgovara Google, google itd. (ali ne ggle).

Točna sintaksa ovih regularnih izraza ovisi o implementaciji. (odnosno u osnovni regularni izrazi simboli (i)- izbjegnuto obrnutom kosom crtom)

Metakarakteri, pojednostavljeno rečeno, simboli koji ne odgovaraju svom stvarnom značenju, odnosno simbolu. (točka) nije točka, već bilo koji znak, itd. Upoznajte se s metakarakterima i njihovim značenjima:

. odgovara sama bilo koji simbol
[nešto] Sukladan bilo koji pojedinačni znak od onih u zagradama. U ovom slučaju: Znak “-” tumači se doslovno samo ako se nalazi neposredno nakon otvaranja ili prije zatvaranja zagrade: ili [-abc]. Inače, označava interval znakova, na primjer, odgovara "a", "b" ili "c". odgovara malim slovima latinične abecede. Ove oznake se mogu kombinirati: odgovara a, b, c, q, r, s, t, u, v, w, x, y, z Za podudaranje znakova “[” ili “]”, dovoljno je da zatvorena zagrada bila je prvi znak nakon početnog znaka: odgovara "]", "[", "a" ili "b". Ako vrijednosti u uglatim zagradama prethodi znak ^, tada se podudara vrijednost izraza pojedinačni znak među onima koji nisu u zagradi. Na primjer, [^abc] odgovara bilo kojem znaku osim "a", "b" ili "c". [^a-z] odgovara bilo kojem znaku osim malih slova u latiničnoj abecedi.
^ Odgovara početku teksta (ili početku bilo kojeg retka ako je način redak po redak).
$ Odgovara kraju teksta (ili kraju bilo kojeg retka ako je način redak po redak).
\(\) ili () Deklariše "označeni podizraz" (grupirani izraz) koji se može koristiti kasnije (pogledajte sljedeći element: \ n). "Označeni podizraz" također je "blok". Za razliku od drugih operatora, ovaj (u tradicionalnoj sintaksi) zahtijeva obrnutu kosu crtu; u proširenom i Perlu znak \ nije potreban.
\n Gdje n- ovo je broj od 1 do 9; odgovara n označeni podizraz (na primjer (abcd)\0, odnosno znakovi abcd označeni su nulom). Ovaj dizajn je teoretski neregularan, nije prihvaćen u sintaksi proširenog regularnog izraza.
*
  • Zvijezda nakon izraza koji odgovara jednom znaku, odgovara nula ili više kopije ovaj (prethodni) izraz. Na primjer, "*" odgovara praznom nizu, "x", "y", "zx", "zyx" itd.
  • \n*, Gdje n je znamenka od 1 do 9, odgovara nula ili više pojavljivanja za podudaranje n th označeni podizraz. Na primjer, "\(a.\)c\1*" odgovara "abcab" i "abcaba", ali ne i "abcac".

Izraz zatvoren u "\(" i "\)" iza kojeg slijedi "*" trebao bi se smatrati nezakonitim. U nekim slučajevima odgovara nula ili više pojavljivanja niza koji je bio u zagradama. U drugima se podudara s izrazom u zagradama, s obzirom na znak "*".

\{x,g\} Odgovara posljednjem ( Nadolazeći) blok koji se javlja najmanje x i nema više g jednom. Na primjer, "a\(3,5\)" odgovara "aaa", "aaaa" ili "aaaaa". Za razliku od drugih operatora, ovaj (u tradicionalnoj sintaksi) zahtijeva obrnutu kosu crtu.
.* Označavanje bilo kojeg broja bilo kojih znakova između dva dijela regularnog izraza.

Metaznakovi nam pomažu u korištenju različitih podudaranja. Ali kako metakarakter možemo predstaviti kao običan znak, odnosno simbol [ (uglata zagrada) sa značenjem uglate zagrade? Samo:

  • mora prethoditi ( štit) metaznak (. * + \ ? ( )) obrnuta kosa crta. Na primjer \. ili \[

Radi pojednostavljenja definicije nekih skupova znakova, oni su spojeni u tzv. klase i kategorije likova. POSIX je standardizirao deklaraciju određenih klasa i kategorija znakova, kao što je prikazano u sljedećoj tablici:

POSIX klasa na sličan način oznaka
[:Gornji:] velika slova
[:niži:] mala slova
[:alfa:] velika i mala slova
[:alnum:] brojevi, velika i mala slova
[:broj:] brojevima
[:xdigit:] heksadecimalne znamenke
[:punct:] [.,!?:…] interpunkcijski znakovi
[:prazan:] [\t] razmak i TAB
[:prostor:] [\t\n\r\f\v] preskakanje znakova
[:cntrl:] kontrolni znakovi
[:graf:] [^\t\n\r\f\v] simboli pečata
[:print:] [^\t\n\r\f\v] simboli brtve i simboli preskoka

U regularnom izrazu postoji nešto poput:

Regularni izraz pohlepe

Pokušat ću to opisati što jasnije. Recimo da želimo pronaći sve HTML oznake u nekom tekstu. Nakon što smo lokalizirali problem, želimo pronaći vrijednosti koje se nalaze između< и >, zajedno s tim istim zagradama. Ali znamo da oznake imaju različite duljine i da postoji najmanje 50 samih oznaka, uvrštavajući ih u metasimbole, previše je dugotrajan zadatak. Ali znamo da imamo izraz.* (točka zvjezdica), koji karakterizira bilo koji broj bilo kojeg znaka u retku. Pomoću ovog izraza pokušat ćemo pronaći u tekstu (

Tako, Kako stvoriti RAID razine 10/50 na LSI MegaRAID kontroleru (također relevantno za: Intel SRCU42x, Intel SRCS16):

) sve vrijednosti između< и >. Kao rezultat, CIJELI redak će odgovarati ovom izrazu. zašto, jer je regex POHLEPAN i pokušava uhvatiti SVE brojeve znakova između< и >, odnosno cijeli red, počevši < p>Dakle... i završetak ...> će pripadati ovom pravilu!

Nadam se da ovaj primjer razjašnjava što je pohlepa. Da biste se riješili ove pohlepe, možete slijediti sljedeći put:

  • uzeti u obzir simbole Ne koji odgovara željenom uzorku (na primjer:<[^>]*> za gornji slučaj)
  • riješite se pohlepe dodavanjem definicije kvantifikatora kao nepohlepnog:
    • *? - "nepohlepan" ("lijeni") ekvivalent *
    • +? - "nepohlepan" ("lijen") ekvivalent +
    • (n,)? - "nepohlepan" ("lijen") ekvivalent (n,)
    • .*? - "nepohlepan" ("lijen") ekvivalent.*

Želim dodati svemu gore navedenom sintaksa proširenog regularnog izraza:

Regularni izrazi u POSIX-u slični su tradicionalnoj Unix sintaksi, ali s dodatkom nekih metakaraktera:

Plus ukazuje na to prethodni simbol ili skupina može se ponoviti jednom ili više puta. Za razliku od zvjezdice, potrebno je najmanje jedno ponavljanje.

Upitnik radi prethodni simbol ili grupa izborno. Drugim riječima, u odgovarajućem redu it može biti odsutan ili prisutan glatko, nesmetano jedan jednom.

Okomita traka odvaja alternative regularnog izraza. Jedan znak označava dvije alternative, ali može ih biti više, samo koristite više okomitih crta. Važno je zapamtiti da ovaj operator koristi što je moguće više izraza. Zbog toga se alternativni operator najčešće koristi unutar zagrada.

Također je ukinuta upotreba obrnutih kosih crta: \(…\) postaje (…) i \(…\) postaje (…).

Za kraj posta dat ću nekoliko primjera korištenja regularnog izraza:

$ cat text1 1 jabuka 2 kruška 3 banana $ grep p text1 1 jabuka 2 kruška $ grep "pp*" text1 1 jabuka 2 kruška $ cat text1 | grep "l\|n" 1 jabuka 3 banana $ echo -e "pronađi\n* ovdje" | grep "\*" * ovdje $ grep "pl\?.*r" text1 # p, u redovima gdje se nalazi r 2 pear $ grep "a.." text1 # redovi s a iza kojeg slijede najmanje 2 znaka 1 jabuka 3 banana $ grep "" text1 # traži retke koji sadrže 3 ili p 1 jabuka 2 kruška 3 banana $ echo -e "pronađi\n* ovdje\nnegdje." | grep "[.*]" * ovdje negdje..ime]$ echo -e "123\n456\n789\n0" | grep "" 123,456,789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # zamijeni a s A u svim redovima gdje dolazi nakon a a ili iza p dolazi p 1 jabuka 2 kruška 3 bAnAnA *\./ POSLJEDNJA RIJEČ./g" Prvo. POSLJEDNJA RIJEČ. Ovo je POSLJEDNJA RIJEČ.

Srdačan pozdrav, McSim!



2024 wisemotors.ru. Kako radi. Željezo. Rudarstvo. Kriptovaluta.