slides - Linux Day Torino
Transcript
slides - Linux Day Torino
Regex – Storia La storia delle espressioni regolari affonda le sue radici negli anni 40' del secolo scorso quando due neurologi formularono un modello di ipotetico del funzionamento del sistema nervoso. La prima applicazioni computazionale risale però al 1968 quando Ken Thompson diede vita a qed l'editor che che fece da base per il più celebre ed Regex – Storia Le espressioni regolari in ed non erano avanzate quanto quelle di qed, ma furono le prime ad avere un'ampia diffusione. In questo editor c'era un comando molto usato: “g/Regular Expression/p” Ovvero: “Global Regular Expression Print” Questa funzione era così utile che fu trasformata in un programma a parte: grep Regex – GREP Grep alle sue origini aveva una sintassi piuttosto povera, come quella di ed nacque così egrep per offrire un supporto più avanzato Oggi egrep è deprecato perché entrambi i dialetti sono stati inclusi in grep Per eseguire grep in modalità extended basta usare l'opzione -E es: grep -E pattern nomefile Regex – GREP Quando gli standard POSIX cominciarono a definire le specifiche per le espressioni regolari raggrupparono le espressioni in due famiglie principali. BASIC BREs ●Extended EREs ● BREs vs EREs La differenza tra le espressioni regolari base ed estese è che molti degli operatori delle espressioni base devono essere preceduti dal carattere di escape \ (barra inversa) , mentre in quelle estese no. Negli esempi che seguono userò la sintassi extended. Es: Basic Extended ^img[0-9]\{3\}\.\(png\|jpg\)$ ^img[0-9]{3}\.(png\|jpg)$ Elementi di regexp Ci sono pochi elementi sintattici che costituiscono la base delle espressioni regolari ● Classi di caratteri [a-z] ● Quantificatori ? + * {n} {n,m} ● Gruppi ( ) ● Alternative | ● Ancore ^ $ Classi Le classi si scrivono tra parentesi quadre [ ] possono esssere indicate come singole occorrenze di caratteri: es: tutt[aoie] per trovare tutta o tutto o tutti o tutte oppure con range di caratteri es: tutt[a-z] per trovare la stringa 'tutt' seguita da un qualsiasi carattere minuscolo Il punto . Carattere '.' Il punto all'interno di un'espressione regolare viene usato come carattere jolly. Permette quindi di trovare un qualsiasi carattere diverso dal ritorno a capo. Per riferirsi veramente ad un punto bisogna quindi precederlo dal carattere di escape es: l'espressione tutt. Trova la stringa 'tutt' seguita da un qualsiasi carattere Quantificatori I quantificatori permettono di indicare il numero di occorrenze di un determinato carattere. Si applicano dopo una classe, un carattere o un gruppo ? significa 0 oppure 1 occorrenza + significa 1 oppure più occorrenze * significa da nessuna ad infinite occorrenze {n} esattamente n occorrenze {n,m} tra n ed m occorrenze .* Capita molto spesso di dover cercare una determinata stringa seguita da una sequenza indefinita di caratteri in questi casi il modo più semplice è utilizzare i punto seguito dall'asterisco es: inizio.* trova tutte le stringhe che contengono 'inizio' seguito da una qualsiasi sequenza di caratteri Gruppi Oltre alle classi ed ai singoli caratteri esistono i gruppi I gruppi vengono definiti tramite parentesi tonde es: (dis)?abilita trova sia le stringhe 'abilita' che 'disabilita' Altenative All'interno dei gruppi è possibile specificare alternative tramite il carattere | (pipe) (dis|ri)?abilita trova abilita , disabilita e riabilita Ancore Quando si scrive un pattern di ricerca i programmi cercano il pattern in qualsiasi posizione della stringa in esame. Per ancorare le ricerche all'inizio o alla fine di una stringa si usano i caratteri ^ (caret) e $ (dollaro) es: fine riga$ ^comincia così.* NB: Il caret però ha un significato radicalmente diverso all'interno delle parentesi quadre [ ] , infatti nega la classe stessa ad esempio [^a] trova un qualsiasi carattere che non sia la lettera minuscola 'a' Tools Esistono molti tools che fanno uso delle regex come ad esempio find, grep, sed ed awk. Find find è un programma che serve a trovare files indicando le caratteristiche. Ha un'opzione -regex che permette di cercare file il cui path faccia match con il pattern dato es: find -regex '.*\.txt' la sintassi di default è basic, ma nelle versioni recenti c'è un'opzione che permette di cambiare il dialetto della regexp manuale di GNU findutils http://www.gnu.org/software/findutils/manual/find.html Tools Grep grep permette di filtrare le righe di un file stampando solo quelle che hanno un match con il pattern dato . Utilizza la sintassi basic a meno che non venga specificata l'opzione -E manuale GNU grep: http://www.gnu.org/software/grep/manual/ Sed StreamEDitor permette di effettuare sostituzioni su uno stream o su file se selezionata l'opzione -i manuale di GNU sed: http://www.gnu.org/software/sed/manual/ AWK AWK è un interprete orientato alla manipolazione di testi. Si tratta già di un linguaggio di programmazione molto leggero con una funzione ben precisa, particolarmente comodo per gestire file di testo a colonne. manuale GNU awk: http://www.gnu.org/manual/gawk/ Tools Locate locate permette di cercare un nome file all'interno di un database dei nomi dei files. Con l'opzione -r si può specificare un'espressione regolare Locate è velocissimo, perché effettua la ricerca senza verificare il filesystem, ma richiede una fase di aggiornamento del db, piuttosto lenta, per rinfrescare la base dati manuale di GNU findutils http://www.gnu.org/software/findutils/manual/find.html