Multe programe Linux folosesc expresii regulate; acestea sunt unelte utilizate pentru descrierea, recunoașterea/căutarea și manipularea unor potriviri de șabloane (patterns) în fișierele text. În principiu, expresiile regulate sunt oarecum similare cu metacaracterele (wildcards) care pot fi folosite pentru a specifica mai multe nume de fișiere. Altfel spus, expresiile regulate sunt niște șiruri de caractere care reprezintă anumite șabloane sau modele (patterns).
Înțelegerea expresiilor regulate
Se întâlnesc două forme de expresii regulate: de bază și extinse. Forma pe care o vom alege depinde de comanda folosită: unele acceptă o formă, altele altă formă sau chiar pe ambele. Diferențele dintre expresiile regulate de bază și cele extinse sunt complexe, dar principiile fundamentale sunt aceleași.
Cea mai simplă formă de expresie regulată este un șir alfabetic, cum ar fi Linux sau Error. Aceste expresii regulate fac potrivirea cu orice șir de caractere de aceeași mărime sau lungime care conține expresia regulată. De exemplu, expresia regulată Error se potrivește cu Error, Error 500, No Error, Error unknown. Adevărata putere a expresiilor regulate vine din folosirea caracterelor nonalfabetice, care activează regulile de potrivire avansate.
Paranteze drepte [ ] - sunt folosite în două cazuri:
- potrivirea cu orice caracter din interiorul parantezelor (bracket expressions): de exemplu, ma[jt]ur se potrivește cu cuvintele majur, matur sau Ion este matur
- potrivirea cu orice caracter care nu este în paranteze: dacă o construcție este de forma 7[^240], atunci ea se va potrivi cu orice caracter care nu este în paranteze - se va potrivi cu orice șir de caractere care conține cifra 7 și nu conține pe poziția următoare niciunul din caracterele 2, 4 sau 0 (atenție: dacă în șirul căruia i se aplică expresia regulată nu conține după 7 niciun alt caracter, expresia nu se va potrivi)
- potrivirea cu fiecare caracter din rang (range expressions) - este o listă care are un început și un sfârșit separat prin caractrerul liniuță (-): de exemplu, expresia regulată b[3-5]t se potrivește cu b3t, b4t și b5t
Orice caracter singur - punctul (.) reprezintă potrivirea cu orice caracter, cu excepția caracterului linie nouă (newline --> \n); de exemplu, expresia regulată b.t se potrivește cu b2t, bft, bJt sau cu orice șir de trei caractere care începe cu b și se termină cu t.
Început și sfârșit de linie - caracterul carat (^) reprezintă începutul unei linii, iar semnul dolar ($) reprezintă sfârșitul liniei; de exemplu, expresia regulată ^tură$ se va potrivi doar cu șirul "tură", nu și cu "tură " sau " tură" sau "alătură".
Operatori pentru specificarea repetițiilor - o expresie regulată poate fi urmată de un simbol special care arată de câte ori trebuie să se repete caracterul sau grupul de caractere pe care îl urmează
- asteriscul (*) - înseamnă zero sau mai multe apariții ale caracterului pe care îl urmează; de exemplu, dacă vom scrie bc*, expresia regulată se va potrivi cu orice șir format dintr-un b și urmat de oricâte caractere c (chiar și de niciunul!)
- semnul plus (+) - reprezintă una sau mai multe apariții (potrivește o dată sau de mai multe ori);
- semnul întrebării (?) - reprezintă zero potriviri sau una singură.
Adesea se combină punctul (.) cu asteriscul (*) pentru a specifica o potrivire cu orice subșir; de exemplu, M.*Eminescu se potrivește cu orice șir care conține M și Eminescu, în această ordine - Mihai Eminescu, Mih Eminescu sau Mihaela Eminescu sunt doar 2 exemple de astfel de potriviri.
Operatorul de alternare (|) - bara verticală separă două posibile potriviri; de exemplu, expresia regulată mere|pere se potrivește atât cu mașină, cât și cu camion.
Parantezele rotunde ( ) - parantezele rotunde înconjoară subexpresiile (pentru gruparea expresiilor regulate); rescriind un exemplu de mai sus, vom observa că operatorul astersic * se va aplica grupului: expresia regulată (bc)* se va potrivi cu mai multe repetiții ale grupului de caractere bc (chiar și cu niciunul).
Escaping (\) - dacă vrem să facem o potrivire cu unul sau mai multe caractere speciale care să nu fie tratate ca operatori ai expresiei regulate, cum ar fi punctul, trebuie să-l precedem cu caracterul escape (reprezentat printr-un backslash); de exemplu, pentru a face o potrivire cu un hostname (să spunem subdomeniu.bobses.eu), vom folosi caracterul escape pentru puncte, astfel: subdomeniu\.bobses\.eu
Mai multe despre expresiile regulate pot fi aflate folosind comanda man 7 regex.
Expresiile regulate sunt folosite pentru filtrarea fișierelor text; astfel de filtre se pot aplica cu comenzile:
- grep - este un filtru complex. Are cel puțin un parametru, care va fi interpretat ca expresie regulată. Liniile citite de la intrarea standard (sau din fișierele date ca parametri) care se potrivesc cu expresia regulată data vor fi afișate;
- sed - efectuează operații de editare asupra intrării (un fișier text).
În articolele următoare voi atinge câteva exemple de folosire a acestor 2 comenzi (grep și sed) cu expresii regulate (la modul simplist, pentru începători).
Ice Alinutza a zis
Foarte interesant! Unele "semne" îmi erau deja cunoscute dar pentru mine articolul începe deja să sune a "chinojaponeză" si personal nu văd cu ce m-ar ajuta! 🙂 Nu mai zic că anumite explicații îmi depășesc puterea de înțelegere, cum ar fi de exemplu: "ma[jt]ur se potrivește cu cuvintele majur, matur sau Ion este matur" - am înțeles partea cu "majur" și "matur" dar nu am înțeles de unde l-ai scos și pe "Ion"? Se potrivea și cu "Gigi" este matur sau doar cu "Ion"? 🙂 Sigur va fi cel mai citit articol! 🙂 Succes!
Bobses a zis
Se potrivea și cu Gigi. :)))
Mersi pentru urări!