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