Ho trovato echo file|grep fil*
non riesce, ma ci echo abcd|grep abc*
riesce.
Non lo capisco, qualcuno può spiegare?
Ho trovato echo file|grep fil*
non riesce, ma ci echo abcd|grep abc*
riesce.
Non lo capisco, qualcuno può spiegare?
Risposte:
Ci sono due problemi con il tuo esempio.
Il principale è che stai assumendo che le espressioni regolari funzionino allo stesso modo dei pattern glob in quanto *
è un carattere jolly che significa "qualsiasi sequenza di caratteri". In espressioni regolari, *
significa invece "qualsiasi numero dell'atomo precedente", quindi fil*
significa f
seguito i
seguito da zero o più l
caratteri. Devi dire grep fil.*
per ottenere il significato previsto: .
significa "qualsiasi singolo carattere, quindi .*
significa" qualsiasi sequenza di caratteri ".
Il problema minore è che stai usando caratteri speciali non quotati che significano qualcosa sotto le regole glob, il che significa che la shell potrebbe interpretarli. Se nella directory locale fossero presenti file corrispondenti ai pattern glob fil*
o abc*
, la shell li espanderebbe , così grep
otterrebbero i nomi dei file espansi come pattern, non la RE prevista. Ogni volta che sei utilizzando tali caratteri sulla riga di comando, si dovrebbe citare: echo file | grep 'fil.*'
.
echo file|grep fil*
risponde confil
e.