[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: espressioni regolari e \



Il giorno 03 Luglio 2009 15.59, Paolo Sala<piviul@riminilug.it> ha scritto:
> Ciao a tutti, mi sto impratichendo un po' di espressioni regolari usati
> tramite script bash (con sed, grep...) e mi imbatto sempre in problemi
> di escape di alcuni caratteri. Ad esempio oggi dovevo usare nelle
> espressioni regolari la {} per trovare una ripetione di un insieme di
> caratteri. Ad esempio consideriamo le ripetizioni del carattere i
>
> echo i ii iii iiii iiiii | sed 's/i\{3,3\}/aaa/g'
>
> mi sostituisce iii con aaa (ho dovuto metter 1 \ davanti a { e }...
> bah!); ma se la voglio usare con grep ad esempio trovando tutte le righe
> di un file contenente iii dovrei usare
>
> grep i\\\{3,3\\\} /path/to/some/file
>
> ho quindi dovuto mettere 3 \ davanti alle graffe... bah!
> Poi se volessi fare la stessa cosa da uno script e mettere il contenuto
> in una variabile:
>
> #!/bin/bash
> [...]
> PIPPO=`grep i\\\\\{3,3\\\\\} /path/to/some/file`
>
> ho quindi dovuto usare 5 \ davanti alle graffe!!!
>
> ...mi piacerebbe capire il perché di tutti questi escape, tutto qua,
> senza tutte le volte trovare la corretta sintassi empiricamente.
>
> Grazie mille
>
> Piviul

il perché è semplice: la shell bash dà un valore particolare ai segni
{}, lo puoi provare con
touch prov{a,b,c,d,e,f}

che viene espanso in
touch prova provb provc provd prove provf

se volessi far arrivare i {} a touch (o grep o altro), dovresti fare
l'escape, cioè \{ \}; però spesso anche il comando dà un significato
particolare a {}, o peggio ancora a \, per cui devi quotare il
backslash.

nel caso della sostituzione `` infine devi quotare tre volte.


poi, un conto è capire perché, e io lo capisco e lo spiego, altro
conto è indovinare sempre al primo colpo quanti \ ci vogliono, e lì
non ci sono ancora arrivato, faccio sempre un sacco di tentativi.


pietro


Reply to: