Egrep exemple de expresii regulate. Cinci exemple de utilizare a grep

În articolul de astăzi vreau să ating un subiect atât de mare ca Expresii obisnuite. Cred că toată lumea știe că subiectul regexe (cum sunt numite expresiile regulate în argou) este vast în domeniul de aplicare a unei postări.

Permiteți-mi să încep prin a spune că există mai multe tipuri de expresii regulate:

1. Expresii regulate tradiționale(sunt, de asemenea, de bază, de bază și expresii regulate de bază(BRE))

  • Sintaxa acestor expresii este definită ca fiind învechită, dar totuși este încă răspândită și utilizată de multe utilitare UNIX
  • Expresiile regulate de bază includ următoarele metacaractere (mai multe despre semnificațiile lor mai jos):
    • \( \) - versiunea inițială pentru ( ) (în extins)
    • \(\) - versiunea inițială pentru () (în extins)
    • \n, Unde n- număr de la 1 la 9
  • Caracteristici ale utilizării acestor metacaractere:
    • Un asterisc trebuie să urmeze expresia corespunzătoare unui singur caracter. Exemplu: *.
    • Expresia \( bloc\)* ar trebui considerat incorect. În unele cazuri, se potrivește cu zero sau mai multe repetări ale șirului bloc. În altele corespunde șirului bloc* .
    • În cadrul unei clase de caractere, semnificațiile caracterelor speciale sunt în mare măsură ignorate. Cazuri speciale:
    • Pentru a adăuga un caracter ^ la un set, acesta nu trebuie plasat primul acolo.
    • Pentru a adăuga un caracter - la un set, acesta trebuie plasat acolo primul sau ultimul. De exemplu:
      • Șablon de nume DNS, care poate include litere, cifre, minus și un punct: [-0-9a-zA-Z.] ;
      • orice caracter, cu excepția minusului și a numerelor: [^-0-9] .
    • Pentru a adăuga un caracter [ sau ] la un set, acesta trebuie plasat mai întâi acolo. De exemplu:
      • potrivește ], [, a sau b.

2. Expresii regulate avansate(sunt expresii regulate extinse(ERE))

  • Sintaxa acestor expresii este similară cu sintaxa expresiilor principale, cu excepția:
    • S-a eliminat utilizarea barelor oblice inverse pentru metacaracterele ( ) și ().
    • O bară oblică inversă înainte ca un metacaracter să îl anuleze sens special.
    • Respins teoretic neregulat proiecta\ n .
    • S-au adăugat metacaractere + , ? , | .

3. Expresii regulate compatibile cu Perl(sunt Expresii regulate compatibile cu Perl(PCRE))

  • au o sintaxă mai bogată și în același timp previzibilă decât chiar și POSIX ERE, deci sunt adesea folosite de aplicații.

Expresii obisnuite constau dinșabloane, sau mai degrabă setați un șablon căutare. Șablonul constă din reguli căutări, care sunt alcătuite din personajeȘi metacaracterele.

Reguli de căutare sunt determinate de următoarele operațiuni:

Enumerare |

țeavă (|) separă opțiunile valide, s-ar putea spune - SAU logic. De exemplu, „gri|gri” se potrivește gri sau gri.

Grup sau sindicat()

Paranteze rotunde sunt folosite pentru a defini domeniul și prioritatea operatorilor. De exemplu, „gri|gri” și „gr(a|e)y” sunt modele diferite, dar ambele descriu un set care conține griȘi gri.

Cuantificare()? * +

Cuantificator după ce un personaj sau un grup determină de câte ori antecedente poate apărea expresia.

expresie generală, repetările pot fi de la m la n inclusiv.

expresie generală m sau mai multe repetări.

expresie generală nu mai mult de n repetări.

netedn repetări.

Semnul întrebării mijloace 0 sau 1 ori, la fel ca {0,1} . De exemplu, „colou?r” se potrivește și culoare, Și culoare.

Stea mijloace 0, 1 sau orice număr o singura data ( {0,} ). De exemplu, „go*gle” se potrivește ggle, Google, Google si etc.

La care se adauga mijloace cel putin 1 o singura data ( {1,} ). De exemplu, „go+gle” se potrivește Google, Google etc. (dar nu ggle).

Sintaxa exactă a acestor expresii regulate este dependentă de implementare. (adică în expresii regulate de bază simboluri ( Și )- a scăpat cu o bară oblică inversă)

Metacaracterele zicală într-un limbaj simplu- acestea sunt simboluri care nu corespund semnificației lor reale, adică un simbol. (punct) nu este un punct, ci orice caracter etc. Vă rugăm să vă familiarizați cu metacaracterele și semnificațiile lor:

. corespunde singur orice simbol
[ceva] Conform orice singur caracter dintre cele cuprinse între paranteze. În acest caz: Caracterul „-” este interpretat literal doar dacă este situat imediat după o deschidere sau înainte de o paranteză de închidere: sau [-abc]. În caz contrar, denotă un interval de caractere. De exemplu, se potrivește „a”, „b” sau „c”. corespunde literelor mici ale alfabetului latin. Aceste denumiri pot fi combinate: potrivește a, b, c, q, r, s, t, u, v, w, x, y, z Pentru a potrivi caracterele „[” sau „]”, este suficient ca paranteza de închidere a fost primul caracter după caracterul de deschidere: se potrivește cu „]”, „[”, „a” sau „b” Dacă valoarea dintre paranteze drepte este precedată de un caracter ^, atunci valoarea expresiei se potrivește un singur personaj dintre aceia care nu sunt între paranteze. De exemplu, [^abc] se potrivește cu orice alt caracter decât „a”, „b” sau „c”. [^a-z] se potrivește cu orice caracter, cu excepția caracterelor minuscule din alfabetul latin.
^ Se potrivește cu începutul textului (sau începutul oricărei linii dacă modul este linie cu linie).
$ Se potrivește cu sfârșitul textului (sau sfârșitul oricărei rânduri dacă modul este linie cu linie).
\(\) sau () Declara o „subexpresie marcată” (expresie grupată) care poate fi folosită ulterior (vezi următorul element: \ n). O „subexpresie marcată” este, de asemenea, un „bloc”. Spre deosebire de alți operatori, acesta (în sintaxa tradițională) necesită o bară oblică inversă în extins și Perl, caracterul \ nu este necesar;
\n Unde n este un număr de la 1 la 9; corespunde n a-a subexpresie marcată (de exemplu (abcd)\0, adică caracterele abcd sunt marcate cu zero). Acest design este teoretic neregulat, nu a fost acceptat în sintaxa extinsă a expresiei regulate.
*
  • Stea după o expresie care se potrivește cu un singur caracter, se potrivește zero sau Mai mult copii această expresie (precedentă). De exemplu, „*” se potrivește cu șirul gol, „x”, „y”, „zx”, „zyx”, etc.
  • \n*, Unde n este un număr de la 1 la 9, se potrivește cu zero sau mai multe apariții n subexpresia marcată. De exemplu, „\(a.\)c\1*” se potrivește cu „abcab” și „abcaba”, dar nu cu „abcac”.

O expresie inclusă în „\(” și „\)” urmată de un „*” ar trebui considerată ilegală. În unele cazuri, se potrivește cu zero sau mai multe apariții ale șirului care a fost inclus în paranteze. În altele, se potrivește cu expresia cuprinsă între paranteze, având în vedere caracterul „*”.

\{X,y\} Corespunde ultimului ( viitoare) bloc care apare cel puțin X si nu mai mult y o singura data. De exemplu, „a\(3,5\)” se potrivește cu „aaa”, „aaaa” sau „aaaaa”. Spre deosebire de alți operatori, acesta (în sintaxa tradițională) necesită o bară oblică inversă.
.* Desemnarea oricărui număr de orice caractere între două părți ale unei expresii regulate.

Metacaracterele ne ajută să folosim diferite potriviri. Dar cum putem reprezenta un metacaracter ca un caracter obișnuit, adică simbolul [ (paranteză pătrată) cu sensul unei paranteze pătrate? Doar:

  • trebuie precedat ( scut) metacaracter (. * + \ ? ( )) bară oblică inversă. De exemplu \. sau \[

Pentru a simplifica definirea unor seturi de caractere, acestea au fost combinate în așa-numitele. clase si categorii de personaje. POSIX a standardizat declararea anumitor clase și categorii de caractere, așa cum se arată în următorul tabel:

Clasa POSIX în mod similar desemnare
[:superior:] caractere majuscule
[:inferior:] caractere mici
[:alfa:] caractere mari și mici
[:alnum:] numere, litere mari și mici
[:cifră:] numere
[:xdigit:] cifre hexazecimale
[:punct:] [.,!?:…] semne de punctuatie
[:gol:] [\t] spațiu și TAB
[:spaţiu:] [\t\n\r\f\v] omite caractere
[:cntrl:] caractere de control
[:grafic:] [^\t\n\r\f\v] simboluri de sigiliu
[:imprimare:] [^\t\n\r\f\v] simboluri de sigiliu și simboluri de salt

În regex există așa ceva ca:

Lăcomie regex

Voi încerca să o descriu cât mai clar posibil. Să zicem că vrem să găsim totul Etichete HTMLîn unele texte. După ce am localizat problema, dorim să găsim valorile cuprinse între< и >, împreună cu aceleași paranteze. Dar știm că etichetele au lungimi diferite și există cel puțin 50 de etichete. A le enumera pe toate, includerea lor în metasimboluri, este o sarcină care necesită prea mult timp. Dar știm că avem o expresie.* (asterisc punct), care caracterizează orice număr de caractere din rând. Prin utilizarea expresie dată vom încerca să găsim în text (

Asa de, Cum se creează nivelul RAID 10/50 pe un controler LSI MegaRAID (relevant și pentru: Intel SRCU42x, Intel SRCS16):

) toate valorile între< и >. Ca rezultat, întreaga linie se va potrivi cu această expresie. de ce, pentru că regex este GREEDY și încearcă să captureze ORICE număr de caractere între< и >, respectiv întreaga linie, începând < p>Deci...și sfârșitul ...> va aparține acestei reguli!

Sper că acest exemplu arată clar ce este lăcomia. Pentru a scăpa de această lăcomie, puteți urma următoarea cale:

  • luați în considerare simbolurile Nu corespunzătoare modelului dorit (de exemplu:<[^>]*> pentru cazul de mai sus)
  • scăpați de lăcomie adăugând o definiție a cuantificatorului ca non-lacom:
    • *? - „nu lacom” („leneș”) echivalent *
    • +? - „nu lacom” („leneș”) echivalent +
    • (n,)? - „nu lacom” („leneș”) echivalent (n,)
    • .*? - „nu lacom” („leneș”) echivalent.*

Aș dori să adaug la toate cele de mai sus sintaxa extinsă a expresiilor regulate:

Expresiile regulate în POSIX sunt similare cu sintaxa tradițională Unix, dar cu adăugarea unor metacaractere:

La care se adauga indică faptul că anterior simbol sau grup poate fi repetat una sau mai multe ori. Spre deosebire de asterisc, este necesară cel puțin o repetare.

Semnul întrebării face anterior simbol sau grup opțional. Cu alte cuvinte, în linia corespunzătoare it poate fi absent sau prezent neted unu o singura data.

Bară verticală separă alternativele de expresie regulată. Un caracter specifică două alternative, dar pot fi mai multe, doar folosiți mai multe bare verticale. Este important de reținut că acest operator folosește cât mai mult posibil din expresie. Din acest motiv, operatorul alternativ este cel mai des folosit între paranteze.

Utilizarea barelor oblice inverse a fost, de asemenea, eliminată: \(…\) devine (…) și \(…\) devine (…).

Pentru a încheia postarea, voi da câteva exemple de utilizare a expresiei regex:

$ cat text1 1 mere 2 pere 3 banane $ grep p text1 1 mar 2 pere $ grep pea text1 2 pere $ grep "p*" text1 1 mar 2 pere 3 banane $ grep "pp*" text1 1 mar 2 pere $ grep " x" text1 $ grep "x*" text1 1 mar 2 pere 3 banane $ cat text1 | grep „l\|n” 1 măr 3 banane $ echo -e „găsește un\n* aici” | grep "\*" * aici $ grep "pp\+" text1 # linii care conțin un p și 1 sau mai multe p 1 măr $ grep "pl\?e" text1 1 măr 2 pere $ grep "pl\?e" text1 # pe cu caracter posibil l 1 mar 2 par $ grep "p.*r" text1 # p, pe liniile unde este r 2 par $ grep "a.." text1 # linii cu a urmat de cel putin 2 caractere 1 mar 3 banana $ grep "\(an\)\+" text1 # Căutați mai multe repetări an 3 banana $ grep "an\(an\)\+" text1 # căutați 2 repetări an 3 banana $ grep "" text1 # linii de căutare unde sunt 3 sau p 1 măr 2 pere 3 banane $ echo -e „găsește un\n* aici\nundeva”. | grep „[.*]” * aici undeva. $ # Căută caracterele de la 3 la 7 $ echo -e „123\n456\n789\n0” | grep "" 123 456 789 $ # Căutăm o cifră care să nu aibă literele n și r înainte de sfârșitul liniei $ grep "[[:digit:]][^nr]*$" text1 1 apple $ sed -e "/\(a .*a\)\|\(p.*p\)/s/a/A/g" text1 # înlocuind a cu A în toate liniile unde a vine după a sau p vine după r 1 măr 2 pere 3 bAnAnA $ sed -e "/^[^lmnXYZ]*$/s/ear/each/g" text1 # înlocuiți ureche cu fiecare în rânduri care nu încep cu lmnXYZ 1 măr 2 piersici 3 banane $ echo " În primul rând, o frază. |\ # înlocuind ultimul cuvânt dintr-o propoziție cu LAST WORLD. > sed -e "s/ [^ ]*\./ ULTIMUL CUVÂNT./g" Primul. UN ULTIM CUVÂNT. Acesta este un ULTIM CUVÂNT.

Context și sursă: Nu toți cei care trebuie să folosească expresii regulate înțeleg pe deplin cum funcționează sau cum să le creeze. Am aparținut și eu acestui grup - am căutat exemple de expresii regulate potrivite sarcinilor mele, am încercat să le corectez după cum era necesar. Totul s-a schimbat radical pentru mine după ce am citit cartea. Linia de comandă Linux (a doua ediție Internet) autor William E. Shotts, Jr. Stabilește principiile modului în care funcționează expresiile regulate atât de clar încât, după ce am citit, am învățat să le înțeleg, să creez expresii regulate de orice complexitate și acum să le folosesc ori de câte ori este necesar. Acest material este o traducere a părții capitolului dedicată expresiilor regulate. Acest material este destinat începătorilor absoluti care nu înțeleg absolut modul în care funcționează expresiile regulate, dar au o anumită înțelegere a modului în care funcționează expresiile regulate. Sper că acest articol vă va ajuta să faceți aceeași descoperire care m-a ajutat pe mine. Dacă materialul prezentat aici nu conține nimic nou pentru dvs., încercați să vă uitați la articolul „Expresii regulate și comanda grep”, Descrie opțiunile grep mai detaliat, precum și exemple suplimentare.

Cum sunt folosite expresiile regulate?

Datele text joacă un rol important în toate sistemele de tip Unix, cum ar fi Linux. Printre altele, textul este rezultatul programelor de consolă, fișierelor de configurare, rapoarte etc. Expresii obisnuite sunt (poate) unul dintre cele mai dificile concepte în lucrul cu text, deoarece implică un nivel ridicat de abstractizare. Dar timpul petrecut studiul lor va fi mai mult decât răsplătit. Dacă știi să folosești expresiile regulate, poți face lucruri uimitoare, deși valoarea lor completă poate să nu fie imediat evidentă.

Acest articol va analiza utilizarea expresiilor regulate împreună cu comanda grep. Dar utilizarea lor nu se limitează la asta: expresiile regulate sunt susținute de alții comenzi Linux, multe limbaje de programare, sunt folosite în configurare (de exemplu, în setările regulii mod_rewrite din Apache), iar unele programe GUI vă permit să setați reguli de căutare/copiere/ștergere cu suport pentru expresii regulate. Chiar și în populare program de birouÎn Microsoft Word, puteți utiliza expresii obișnuite și caractere joker pentru a găsi și înlocui text.

Ce sunt expresiile regulate?

În termeni simpli, o expresie regulată este un simbol, o notație simbolică a unui model care este căutat în text. Expresiile regulate sunt susținute de multe instrumente Linie de comandași majoritatea limbajelor de programare și sunt folosite pentru a facilita rezolvarea problemelor legate de manipularea textului. Cu toate acestea, de parcă complexitatea lor nu este suficientă pentru noi, nu toate expresiile regulate sunt create egale. Acestea variază ușor de la un instrument la altul și de la un limbaj de programare la altul. Pentru discuția noastră ne vom limita la expresiile regulate descrise în Standardul POSIX(care va acoperi majoritatea instrumentelor de linie de comandă), spre deosebire de multe limbaje de programare (mai ales Perl) care folosesc seturi de notații ceva mai mari și mai bogate.

grep

Programul principal pe care îl vom folosi pentru expresiile regulate este vechiul nostru prieten, . Numele „grep” provine de fapt de la expresia „global regular expression print”, așa că putem vedea că grep are ceva de-a face cu expresiile regulate. În esență, grep caută în fișierele text text care se potrivește cu expresia regulată specificată și îl trimite ieșire standard orice șir care conține o potrivire.

grep poate căuta textul primit în intrarea standard, de exemplu:

ls /usr/bin | zip grep

Această comandă va lista fișierele din directorul /usr/bin ale căror nume conțin subșirul „zip”.

Programul grep poate căuta text în fișiere.

Sintaxă generală de utilizare:

Grep [opțiuni] regex [fișier...]

  • regex este o expresie regulată.
  • [fişier…]- unul sau mai multe fișiere care vor fi căutate folosind o expresie regulată.

[Opțiuni] și [fișier...] pot lipsi.

Lista celor mai frecvent utilizate opțiuni grep:

Opțiune Descriere
-i Ignora majusculele. Nu faceți diferența între caracterele mari și cele mici. De asemenea, puteți seta opțiunea --ignora-majuscule.
-v Inversați potrivirea. În mod normal, grep va imprima liniile care conțin potrivirea. Această opțiune face ca grep să imprime fiecare linie care nu conține o potrivire. De asemenea, puteți utiliza --invers-potrivire.
-c Tipăriți numărul de potriviri (sau nepotriviri dacă este specificată opțiunea -v) în locul liniilor în sine. De asemenea, puteți specifica opțiunea --numara.
-l În loc de liniile în sine, tipăriți numele fiecărui fișier care conține potrivirea. Poate fi specificat cu opțiunea --fișiere-cu-potriviri.
-L Ca opțiune -l, dar imprimă numai nume de fișiere care nu conțin potriviri. Un alt nume de opțiune --fișiere-fără potrivire.
-n Adăugarea unui număr de linie în fișier la începutul fiecărei linii potrivite. Un alt nume de opțiune --Numărul de linie.
-h Pentru a căuta mai multe fișiere, suprimați ieșirea numelui fișierului. De asemenea, puteți specifica opțiunea --no-filename.

Pentru a explora grep mai pe deplin, haideți să creăm câteva fișiere text Pentru căutare:

Ls /bin > dirlist-bin.txt ls /usr/bin > dirlist-usr-bin.txt ls /sbin > dirlist-sbin.txt ls /usr/sbin > dirlist-usr-sbin.txt ls dirlist*.txt dirlist -bin.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

Putem face o căutare simplă prin lista noastră de fișiere, astfel:

Grep bzip dirlist*.txt dirlist-bin.txt:bzip2 dirlist-bin.txt:bzip2recover

În acest exemplu, grep caută în toate fișierele listate șirul bzip și găsește două potriviri, ambele în fișierul dirlist-bin.txt. Dacă ne interesează doar lista de fișiere care conțin potrivirile, și nu șirurile care se potrivesc în sine, putem specifica opțiunea -l:

Grep -l bzip dirlist*.txt dirlist-bin.txt

În schimb, dacă am dori să vedem doar o listă de fișiere care nu conțineau potriviri, am putea face acest lucru:

Grep -L bzip dirlist*.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

Dacă nu există nicio ieșire, înseamnă că nu au fost găsite fișiere care îndeplinesc condițiile.

Metacaractere și literale

Deși poate să nu pară evident, căutările noastre grep folosesc întotdeauna expresii regulate, deși sunt foarte simple. Expresia regulată „bzip” înseamnă că va avea loc o potrivire (adică linia va fi considerată o potrivire) numai dacă linia din fișier conține cel puțin patru caractere și că caracterele „b”, „z” sunt undeva în linie , „i” și „p” sunt în această ordine, fără alte caractere între ele. Caracterele din șirul „bzip” sunt literali, adică simboluri literale, deoarece ele corespund lor înșiși. Pe lângă literale, pot include și expresiile regulate metacaracterele, care sunt folosite pentru a specifica potriviri mai complexe. Metacaracterele expresiei regulate constau în următoarele:

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

Toate celelalte personaje sunt considerate literale. Caracterul backslash poate avea semnificații diferite. Este folosit în mai multe cazuri pentru a crea meta-secvențe, și, de asemenea, permite metacaracterelor să fie evadate și tratate nu ca metacaractere, ci ca literale.

Notă: după cum putem vedea, multe metacaractere ale expresiilor regulate sunt, de asemenea, caractere cu semnificație de shell (performing expansion). Când specificați o expresie regulată care conține metacaractere de linie de comandă, este extrem de important ca aceasta să fie cuprinsă între ghilimele, altfel shell-ul le va interpreta în felul său și va întrerupe comanda.

Orice personaj

Primul metacaracter cu care ne vom începe cunoștința este simbol punct, care înseamnă „orice personaj”. Dacă îl includem într-o expresie regulată, atunci se va potrivi cu orice caracter pentru acea poziție a caracterului. Exemplu:

Grep -h „.zip” dirlist*.txt bunzip2 bzip2 bzip2recover gunzip gzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

Am căutat orice șir în fișierele noastre care se potrivea cu expresia obișnuită „.zip”. Sunt câteva de remarcat momente interesanteîn rezultatele obţinute. Rețineți că program zip nu a fost găsit. Acest lucru se datorează faptului că includerea metacaracterului punct în expresia noastră regulată a mărit lungimea necesară pentru o potrivire la patru caractere și, deoarece numele „zip” conține doar trei, nu se potrivește. De asemenea, dacă oricare dintre fișierele din listele noastre conținea o extensie de fișier .zip, ar fi, de asemenea, considerate eligibile, deoarece caracterul punct din extensia de fișier se califică și pentru condiția „orice caracter”.

Ancore

Simbol caret ( ^ ) și semnul dolarului ( $ ) sunt considerate în expresiile regulate ancore. Aceasta înseamnă că provoacă o potrivire numai dacă expresia regulată este găsită la începutul șirului ( ^ ) sau la sfârșitul liniei ( $ ):

Grep -h „^zip” dirlist*.txt zip zipcloak zipdetails zipgrep zipinfo zipnote zipsplit grep -h „zip$” dirlist*.txt gunzip gzip funzip gpg-zip mzip p7zip preunzip prezip unzip zip grep$ -h "^zip list *.txt zip

Aici am căutat în listele de fișiere șirul „zip” situat la începutul liniei, la sfârșitul rândului și, de asemenea, într-o linie în care ar fi atât la început, cât și la sfârșit (adică întreaga linie ar conține doar „zip” ). Vă rugăm să rețineți că expresia regulată „ ^$ " (începutul și sfârșitul fără nimic între) se vor potrivi cu liniile goale.

O scurtă digresiune: un asistent pentru cuvinte încrucișate

Chiar și cu limita noastră acest moment Cu cunoștințele expresiilor regulate putem face ceva util.

Dacă ați făcut vreodată cuvinte încrucișate, ați trebuit să rezolvați probleme precum „care este cuvântul cu cinci litere unde a treia literă este un „j” și ultima literă este un „r”, ceea ce înseamnă...”. Această întrebare vă poate da o pauză. Știai că în sistem Linux ai un dictionar? Si el este. Căutați în directorul /usr/share/dict, puteți găsi unul sau mai multe dicționare acolo. Dicționarele postate acolo sunt pur și simplu liste lungi de cuvinte, câte unul pe rând, aranjate în ordine alfabetică. Pe sistemul meu, fișierul dicționar conține 99171 de cuvinte. Pentru a căuta posibile răspunsuri la întrebarea de cuvinte încrucișate de mai sus, putem face acest lucru:

Grep -i "^..j.r$" /usr/share/dict/american-english Major major

Folosind această expresie regulată, putem găsi toate cuvintele din fișierul nostru dicționar care au cinci litere, au un „j” în a treia poziție și un „r” în ultima poziție.

Exemplul a folosit un fișier dicționar englez, deoarece este prezent în sistem în mod implicit. După ce ați descărcat anterior dicționarul corespunzător, puteți efectua căutări similare folosind cuvinte în chirilic sau orice alte caractere.

Expresii paranteze și clase de caractere

Pe lângă potrivirea oricărui caracter la o anumită poziție în expresia noastră regulată, folosim și expresii între paranteze drepte, putem seta o potrivire la un singur caracter din setul de caractere specificat. Cu expresii paranteze, putem specifica un set de caractere care să se potrivească (inclusiv caractere care altfel ar fi interpretate ca metacaractere). În acest exemplu, folosind un set de două caractere:

Grep -h „zip” dirlist*.txt bzip2 bzip2recover gzip

vom găsi orice linii care conțin șirurile „bzip” sau „gzip”.

Setul poate conține orice număr de caractere, iar metacaracterele își pierd semnificația specială atunci când sunt plasate între paranteze drepte. Cu toate acestea, există două cazuri în care metacaracterele folosite între paranteze pătrate au semnificații diferite. Prima este trăsura ( ^ ), care este folosit pentru a indica negația; a doua este o liniuță ( - ), care este folosit pentru a specifica o serie de caractere.

Negare

Dacă primul caracter al expresiei dintre paranteze pătrate este un accent ( ^ ), apoi caracterele rămase sunt luate ca un set de caractere care nu ar trebui să fie prezente la poziția dată a caracterului. Să facem asta schimbând exemplul nostru anterior:

Grep -h „[^bg]zip” dirlist*.txt bunzip2 gunzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

Cu negația activată, obținem o listă de fișiere care conțin șirul „zip” precedat de orice alt caracter decât „b” sau „g”. Vă rugăm să rețineți că zip nu a fost găsit. Un set de caractere negat necesită încă un caracter la poziția dată, dar caracterul nu trebuie să fie membru al setului de caractere negat.

Caracterul caret este negat numai dacă este primul caracter dintr-o expresie între paranteze; în caz contrar, își pierde pe a lui numire specialăși devine un simbol obișnuit din set.

Gama de caractere tradiționale

Dacă vrem să construim o expresie regulată care ar trebui să găsească fiecare fișier din lista noastră care începe cu majusculă, putem face următoarele:

Grep -h „^” dirlist*.txt MAKEDEV GET HEAD POST VBoxClient X X11 Xorg ModemManager NetworkManager VBoxControl VBoxService

Ideea este că punem toate cele 26 de majuscule în expresie între paranteze pătrate. Dar ideea de a le imprima pe toate nu inspiră entuziasm, așa că există o altă modalitate:

Grep -h „^” dirlist*.txt

Folosind un interval de trei caractere, putem scurta intrarea de 26 de litere. Puteți exprima orice interval de caractere în acest fel, inclusiv mai multe intervale simultan, cum ar fi această expresie, care se potrivește cu toate numele fișierelor care încep cu litere și cifre:

Grep -h „^” dirlist*.txt

În intervalele de caractere vedem că caracterul liniuță este tratat într-un mod special, deci cum putem include caracterul liniuță într-o expresie între paranteze pătrate? Făcându-l primul personaj din expresie. Să ne uităm la două exemple:

Grep -h "" dirlist*.txt

Aceasta se va potrivi cu fiecare nume de fișier care conține o literă majusculă. în care:

Grep -h „[-AZ]” dirlist*.txt

se va potrivi cu fiecare nume de fișier care conține o liniuță sau un „A” majuscul sau „Z”.

Expresiile regulate sunt foarte Unealtă puternică pentru căutarea textului după model, procesarea și schimbarea șirurilor de caractere, care pot fi folosite pentru a rezolva multe probleme. Iată pe cele principale:

  • Verificarea introducerii textului;
  • Căutați și înlocuiți text într-un fișier;
  • Redenumirea în lot a fișierelor;
  • Interacțiunea cu servicii precum Apache;
  • Verificarea unui șir pentru potrivirea unui model.

Acest lucru este departe de lista plina, expresiile regulate vă permit să faceți mult mai mult. Dar pentru utilizatorii noi, acestea pot părea prea complicate, deoarece folosesc un limbaj special pentru a le crea. Dar având în vedere capabilitățile oferite, toată lumea ar trebui să cunoască și să poată folosi expresiile regulate Linux Administrator de sistem.

În acest articol, ne vom uita la expresiile regulate bash pentru începători, astfel încât să puteți înțelege toate caracteristicile acestui instrument.

Există două tipuri de caractere care pot fi folosite în expresiile regulate:

  • litere obișnuite;
  • metacaracterele.

Caracterele comune sunt literele, cifrele și semnele de punctuație care alcătuiesc orice șir. Toate textele sunt alcătuite din litere și le puteți folosi în expresii obișnuite pentru a găsi poziția dorită în text.

Metacaracterele sunt altceva; Cu metacaracterele puteți face mult mai mult decât să căutați un singur personaj. Puteți căuta combinații de simboluri, puteți utiliza un număr dinamic de simboluri și puteți selecta intervale. Toate caracterele speciale pot fi împărțite în două tipuri: caractere de înlocuire, care înlocuiesc caracterele obișnuite, sau operatori, care indică de câte ori poate fi repetat un caracter. Sintaxa expresiei regulate ar arăta astfel:

caracter_obișnuit operator_caracter special

caracter_special_de_înlocuire operator_caracter special

  • — caracterele speciale alfabetice încep cu o bară oblică inversă și este, de asemenea, folosită dacă trebuie să utilizați un caracter special sub forma oricărui semn de punctuație;
  • ^ — indică începutul liniei;
  • $ — indică sfârșitul liniei;
  • * — indică faptul că caracterul anterior poate fi repetat de 0 sau de mai multe ori;
  • + — indică faptul că caracterul anterior trebuie repetat o dată sau de mai multe ori;
  • ? — caracterul anterior poate apărea zero sau o dată;
  • (n)— indică de câte ori (n) trebuie repetat caracterul anterior;
  • (N,n)— caracterul anterior poate fi repetat de la N la n ori;
  • . — orice caracter, cu excepția avansului de linie;
  • — orice caracter specificat între paranteze;
  • x|y— simbolul x sau simbolul y;
  • [^az]- orice caracter cu excepția celor indicate între paranteze;
  • — orice caracter din intervalul specificat;
  • [^a-z]— orice caracter care nu se află în interval;
  • b— denotă o limită de cuvânt cu un spațiu;
  • B— înseamnă că caracterul trebuie să fie în interiorul unui cuvânt, de exemplu, ux se va potrivi cu uxb sau tuxedo, dar nu se va potrivi cu Linux;
  • d— înseamnă că simbolul este un număr;
  • D— caracter nenumeric;
  • n— caracter de avans de linie;
  • s- unul dintre caracterele de spațiu, spațiu, tab și așa mai departe;
  • S— orice caracter, cu excepția spațiului;
  • t— caracterul tabulatorului;
  • v— caracter de filă verticală;
  • w- orice caracter alfabetic, inclusiv liniuță de subliniere;
  • W- orice caracter alfabetic, cu excepția literei de subliniere;
  • uXXX— Simbol Unicdoe.

Este important să rețineți că trebuie să utilizați o bară oblică înaintea caracterelor speciale alfabetice pentru a indica faptul că urmează un caracter special. Reversul este, de asemenea, adevărat, dacă doriți să utilizați un caracter special care este folosit fără bară oblică ca caracter obișnuit, atunci va trebui să adăugați o bară oblică.

De exemplu, doriți să găsiți linia 1+ 2=3 în text. Dacă utilizați acest șir ca expresie regulată, nu veți găsi nimic, deoarece sistemul interpretează plusul ca un caracter special care indică faptul că unitatea anterioară trebuie repetată o dată sau de mai multe ori. Deci, trebuie să fie scapat: 1 + 2 = 3. Fără a scăpa, expresia noastră regulată s-ar potrivi doar cu șirul 11=3 sau 111=3 și așa mai departe. Nu este nevoie să puneți o linie în fața egalului, deoarece nu este un caracter special.

Exemple de utilizare a expresiilor regulate

Acum că am acoperit elementele de bază și știi cum funcționează totul, tot ce rămâne este să consolidezi cunoștințele pe care le-ai dobândit despre expresiile regulate linux grep în practică. Două caractere speciale foarte utile sunt ^ și $, care indică începutul și sfârșitul unei linii. De exemplu, dorim să înregistrăm toți utilizatorii în sistemul nostru al căror nume începe cu s. Apoi puteți folosi o expresie regulată „^s”. Puteți folosi comanda egrep:

egrep "^s" /etc/passwd

Dacă dorim să selectăm linii pe baza ultimului caracter din linie, putem folosi $ pentru aceasta. De exemplu, să selectăm toți utilizatorii de sistem, fără un shell, înregistrările despre astfel de utilizatori se termină cu fals:

egrep "false$" /etc/passwd

Pentru a afișa numele de utilizator care încep cu s sau d, utilizați această expresie:

egrep "^" /etc/passwd

Același rezultat poate fi obținut folosind simbolul „|”. Prima opțiune este mai potrivită pentru game, iar a doua este mai des folosită pentru obișnuit sau/sau:

egrep "^" /etc/passwd

Acum să selectăm toți utilizatorii al căror nume nu are trei caractere. Numele de utilizator se termină cu două puncte. Putem spune că poate conține orice caracter alfabetic, care trebuie repetat de trei ori, înainte de două puncte:

egrep "^w(3):" /etc/passwd

concluzii

În acest articol am acoperit expresiile regulate Linux, dar acestea au fost doar elementele de bază. Dacă săpați puțin mai adânc, veți descoperi că puteți face mult mai multe lucruri interesante cu acest instrument. A-ți face timp pentru a stăpâni expresiile regulate va merita cu siguranță.

Pentru a încheia, o prelegere de la Yandex despre expresiile regulate:

Expresie uzuala- un model de text format dintr-o combinație de litere, cifre și caractere speciale cunoscute sub numele de metacaractere. O rudă apropiată a expresiilor regulate sunt expresiile wildcard, adesea folosite în gestionarea fișierelor. Expresiile regulate sunt folosite în principal pentru compararea textului și căutarea. Folosit pe scară largă pentru analiza sintaxei.

Utilizatorii UNIX sunt familiarizați cu expresiile regulate din grep, sed, awk (sau gawk) și ed. Folosind aceste programe sau analogii lor, puteți încerca și verifica exemplele de mai jos. Editori de text programe precum (X)Emacs și vi folosesc, de asemenea, expresiile regulate. Poate cea mai cunoscută și mai răspândită utilizare a expresiilor regulate are loc în limbajul Perl. Este dificil pentru dezvoltatorii de software și administratorii de sistem să se descurce fără cunoașterea expresiilor regulate.

Metacaracterele

Deci, șirurile pot consta din litere, cifre și metacaractere. Metacaracterele sunt:

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

Metacaracterele pot juca următoarele roluri într-o expresie regulată:

    cuantificator

    afirmație;

    semn de grup;

    alternativă;

    semnul secvenței

Cuantificatori

Metacaracterul * (asterisc) înlocuiește 0 sau mai multe caractere. Metacaracterul + (plus) înlocuiește 1 sau mai multe caractere. Metacaracter. (punct) înlocuiește exact 1 caracter arbitrar. Metacaracter? (semnul de întrebare) înlocuiește 0 sau 1 caracter. Diferența în utilizarea * și + este de așa natură încât o interogare pentru șirul c* va returna orice șiruri, inclusiv cele goale, în timp ce o interogare cu c+ va returna doar șiruri care conțin caracterul c.

Liniile goale respectă următoarele convenții: o linie goală conține una și o singură linie goală; într-un șir nevid, liniile goale sunt conținute înaintea fiecărui caracter și, de asemenea, la sfârșitul rândului.

Expresiile regulate folosesc și construcția (n,m), ceea ce înseamnă că caracterul care precede construcția apare de n la m ori pe linie. Omitând numărul m înțelegem infinit. Acestea. cazuri speciale de construcție sunt următoarele înregistrări: (0,) , (1,) și (0,1) . Primul se potrivește cu *, al doilea se potrivește cu metacaracterul +, iar al treilea se potrivește? . Aceste egalități pot fi obținute cu ușurință din definirea cuantificatorilor corespunzători. În plus, construcția (n) înseamnă că simbolul apare exact de n ori.

În legătură cu utilizarea unor semne de punctuație și simboluri matematice ca metacaractere, a fost introdus un metacaracter suplimentar \ (backslash), care, atunci când este scris înaintea unui metacaracter, îl transformă pe acesta din urmă într-un caracter obișnuit. Acestea. ? este un cuantificator și \? - semnul întrebării.

Grupuri

Cuantificatorii descriși mai sus, așa cum sa menționat deja, acționează pe simbolul cel mai apropiat de ei din stânga (ultimul precedent). Dar această limitare poate fi ocolită de grupurile care folosesc metacaractere (și) în denumirile lor. Aceste simboluri izolează o subexpresie dintr-o expresie, care este combinată într-un grup, căruia i se aplică apoi cuantificatorul.

Exemplu:

înseamnă (sau înlocuiește)

Ho ho ho ho ho ho hohoho

Sunt posibile imbricarea subexpresiilor, de ex. Subexpresiile de lungime mai scurtă pot fi extrase dintr-o subexpresie.

Alternative

Format folosind metasimbolul | (bară verticală) care denotă un „sau” logic.

Exemplu: expresie regulată cows(a|s|e|y|oh|oh)? specifică toate inflexiunile posibile ale cuvântului „vacă” la singular după caz.

Declarații

Se identifică metacaracterele care denotă obiecte speciale - linii de lungime zero care servesc la determinarea locației textului care le precede sau le urmează. Astfel de obiecte se numesc aserțiuni. Următoarele afirmații există în expresiile regulate:

^ începutul liniei $ sfârşitul rândului< начало слова >sfârşitul cuvântului

Exemplu: Expresia regulată $The se potrivește cu un șir care începe cu The .

Notă: caracterele obișnuite pot fi considerate declarații cu lungime diferită de zero.

Secvențe

O construcție specială inclusă în metacaractere [ și ] (paranteze dreptunghiulare) vă permite să enumerați variante de caractere care pot apărea într-o expresie regulată pe acest loc, și se numește o secvență. În paranteze dreptunghiulare, toate metacaracterele sunt tratate ca caractere simple, iar simbolurile - (minus) și ^ capătă noi semnificații: primul vă permite să specificați o secvență continuă de caractere între două caractere specificate, iar al doilea dă un „nu” logic. ” (negație). Este mai ușor să luați în considerare următoarele exemple:

oricare dintre literele latine mici:

Caracter alfanumeric latin (de la a la z, de la A la Z și de la 0 la 9):

caracter alfanumeric non-latin:

[^a-zA-Z0-9]

orice cuvânt (fără cratime, simboluri matematice și numere):

<+>

Pentru concizie și simplitate, sunt introduse următoarele abrevieri:

\d cifră (adică corespunde expresiei); \D nu este o cifră (adică [^0-9]); \w cuvânt latin (alfanumeric); \W este o secvență de caractere fără spații care nu este un cuvânt alfanumeric latin ([^a-zA-Z0-9]); \s spațiu gol [ \t\n\r\f] , adică. spații, file etc. \S interval nevid ([^ \t\n\r\f]).

Relația cu metacaracterele

Probabil că fiecare utilizator este familiarizat cu metacaracterele. Un exemplu de expresie wildcard este *.jpg, care reprezintă toate fișierele cu extensia jpg. Cum diferă expresiile regulate de metacaracterele? Diferențele pot fi rezumate în trei reguli pentru conversia unei expresii arbitrare cu metacaractere într-o expresie regulată:

    Inlocuit de.*

    A inlocui? pe.

    Înlocuiți toate caracterele care se potrivesc cu metacaracterele cu versiunile lor cu bară oblică inversă.

Într-adevăr, într-o expresie regulată, intrarea * este inutilă și produce un șir gol, deoarece înseamnă că linia goală se repetă de câte ori se dorește. Dar * (repetați un simbol arbitrar de câte ori doriți, inclusiv 0) coincide exact ca semnificație cu simbolul * din setul de wildcards.

O expresie regulată care se potrivește cu *.jpg ar arăta astfel: .*\.jpg . Și, de exemplu, succesiunea de caractere metalice ez*.pp corespunde la două expresii regulate echivalente - ez.*\.pp și ez.*\.(cpp|hpp) .

Exemple de expresii regulate

Format de e-mail [email protected]

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

E-mail în formatul „Ivan Ivanov "

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

Verificarea protocolului web în adresa URL (http://, ftp:// sau https://)

+://

Câteva comenzi și directive C/C++:

^#include[ \t]+[<"][^>"]+[">] - include directiva

//.+$ - comentariu pe o linie

/\*[^*]*\*/ - comentează pe mai multe rânduri

-?+\.+ - număr în virgulă mobilă

0x+ este un număr din sistemul numeric hexazecimal.

Și iată, de exemplu, un program pentru a căuta cuvântul vaca:

grep -E „vacă|vache” * >/ dev/ null && echo „Găsit o vaca”

Aici opțiunea -E este folosită pentru a activa suportul pentru sintaxa extinsă a expresiilor regulate.

Textul se bazează pe un articol al lui Jan Borsodi din fișierul HOWTO-regexps.htm

O expresie continuă este un model care descrie un set de șiruri. Expresiile regulate sunt construite în mod similar cu expresiile aritmetice, folosind diferiți operatori pentru a combina expresii mai mici.

Expresii continue (expresii regulate engleze, abreviat RegExp, RegEx, jargon regexps sau regexes) - un sistem de analiză a fragmentelor de text conform unui șablon formalizat, bazat pe un sistem de înregistrare a modelelor pentru căutare. Exemplu (model în engleză) stabilește regula de căutare în rusă, de asemenea, se face clic pe „șablon”, „mască”. Expresiile regulate au revoluționat procesarea conținutului electronic la sfârșitul secolului al XX-lea. Ele par a fi o dezvoltare a caracterelor wildcard.

Acum, expresiile constante sunt folosite de numeroase editori de text și utilitare pentru a căuta și modifica textul pe baza regulilor selectate. Aproape multe limbaje de programare acceptă expresii regulate pentru lucrul cu șiruri. De exemplu, Java, .NET Framework, Perl, PHP, JavaScript, Python etc. au suport încorporat pentru expresii constante. Un set de utilitare (inclusiv editorul sed și filtrul grep) găsite în distribuțiile UNIX au fost printre cele originale care au ajutat la popularizarea conceptului de expresii regulate.

Una dintre comenzile mai utile și mai bogate în funcții din terminalul Linux este comanda „grep”. Grep este un acronim care înseamnă „printare expresie regulată globală” (adică „căutați peste tot șiruri care se potrivesc cu o expresie constantă și imprimați-le”).

Aceasta înseamnă că grep poate fi folosit pentru a vedea dacă intrarea se potrivește cu modelele date. În forma sa cea mai simplă, grep este folosit pentru a găsi potriviri de modele de litere într-un fișier text. Aceasta înseamnă că, dacă grep dobândește un cuvânt de căutare, va tipări fiecare linie din fișierul care conține acel cuvânt.

Scopul grep este de a căuta șiruri de caractere în funcție de condiția reprezentată de expresia regulată. Există modificări la grep clasic - egrep, fgrep, rgrep. Toate sunt perfecționate în scopuri specifice, în timp ce abilitățile grep acoperă toate funcționalitățile. Cel mai simplu exemplu de utilizare a comenzii este de a scoate o linie care se potrivește cu un model dintr-un fișier. Exemplu dorim să găsim o linie care stochează „utilizator” în fișierul /etc/mysql/my.cnf. Pentru a face acest lucru, utilizați următoarea comandă:

Utilizatorul Grep /etc/mysql/my.cnf

Grep poate căuta pur și simplu un anumit cuvânt:

Grep Bună ziua ./example.cpp

Sau un șir, dar în această versiune trebuie să fie cuprins între ghilimele:

Grep „Bună lume” ./example.cpp

În plus, alternativele de program sunt egrep și fgrep, care sunt aceleași cu grep -E și, respectiv, grep -F. Opțiunile egrep și fgrep sunt depreciate, dar funcționează pentru compatibilitate cu versiunea anterioară. Se recomandă să utilizați grep -E și grep –F în locul opțiunilor vechi.

Comanda grep potrivește liniile din fișierele sursă cu un model, această expresie regulată de bază. Dacă nu sunt specificate fișiere, este utilizată intrarea standard. Ca de obicei, fiecare șir potrivit cu succes este copiat în ieșirea standard; Dacă
Există doar câteva fișiere sursă; numele fișierului este afișat înainte de linia găsită. Expresiile continue de bază (expresiile care au șiruri de caractere cu semnificațiile lor și folosesc un set limitat de caractere alfanumerice și speciale) sunt percepute ca șabloane.

Folosind egrep pe Linux

Egrep sau grep -E este o altă versiune a grep sau Extended grep. Această versiune de grep este excelentă și rapidă când vine vorba de potrivirea modelelor de expresii regulate, deoarece tratează metacaracterele așa cum sunt și nu le înlocuiește ca șiruri. Egrep folosește ERE sau Extended Extended Expression.

egrep este un apel redus la grep cu comutatorul -E Diferența față de grep este capacitatea de a folosi expresii continue extinse folosind clase de caractere POSIX. Adesea apare sarcina de a căuta cuvinte sau reprezentări care aparțin aceluiași tip, dar cu posibile variații de ortografie, precum date, nume de fișiere cu o anumită extensie și nume standard, adrese de e-mail. Pe de altă parte, există sarcini de găsire a cuvintelor bine definite, care pot avea stiluri diferite, sau o căutare care exclude caractere individuale sau clase de caractere.

În aceste scopuri de adevăr, unele sisteme au fost create pe baza descrierii textului folosind șabloane. Expresiile constante sunt de asemenea incluse în astfel de sisteme. Două caractere speciale foarte utile sunt ^ și $, care indică începutul și sfârșitul unei linii. De exemplu, dorim să înregistrăm toți utilizatorii în sistemul nostru al căror nume începe cu s. Apoi puteți folosi expresia regulată „^s”. Puteți folosi brigada egrep:

Egrep "^s" /etc/passwd

Este posibil să căutați în mai multe fișiere și, în acest caz, numele fișierului este afișat înainte de linie.

Egrep -i Bună ziua ./example.cpp ./example2.cpp

Și următoarea interogare afișează întregul cod, excluzând liniile care conțin doar comentarii:

Egrep -v ^/ ./exemplu.cpp

Ca egrep, chiar dacă nu scapi de metacaractere, comanda le va trata ca caractere speciale și le va înlocui cu semnificația sa specială în loc să le trateze ca parte a șirului.

Folosind fgrep pe Linux

Fgrep sau Grep fix sau grep -F este o altă versiune a grep care este necesară atunci când vine vorba de căutarea întregii linii în loc de un concept obișnuit, deoarece nu recunoaște nici expresii regulate, nici metacaractere. Pentru a căuta direct orice șir, alegeți această versiune de grep.

Fgrep caută întregul șir și nu recunoaște caracterele speciale ca parte a unei expresii continue, indiferent dacă caracterele sunt sau nu.

Fgrep -C 0 "(f|g)ile" fișier_verificare fgrep -C 0 "\(f\|g\)ile" fișier_verificare

Folosind sed pe Linux

sed (din limba engleză Stream EDitor) este un editor de text în flux (precum și un limbaj de programare) care utilizează diverse transformări de text predefinite într-un flux secvenţial de date text. Sed poate fi tratat ca grep, producând linii folosind un model de expresie regulată de bază:

Sed -n /Hello/p ./example.cpp

Poate îl folosiți pentru a elimina liniile (eliminând toate liniile goale):

Sed /^$/d ./example.cpp

Instrumentul principal de lucru cu sed este o expresie ca:

Sed s/search_expression/what_to_replace/file_name

Deci, un exemplu, dacă rulați comanda:

Sed s/int/long/ ./example.cpp

Diferențele dintre „grep”, „egrep” și „fgrep” sunt discutate mai sus. În ciuda diferențelor între setul de reprezentări obișnuite utilizate și viteza de execuție, opțiunile liniei de comandă rămân aceleași pentru toate cele trei versiuni de grep.

Acțiune