Perché fallisce `grep fil *`?


9

Ho trovato echo file|grep fil*non riesce, ma ci echo abcd|grep abc*riesce.

Non lo capisco, qualcuno può spiegare?


Puoi aggiungere il sistema e la versione di grep? Questo perché con gnugrep 2.16 (sotto Ubuntu 14.04 LTS), non genera alcun errore (codice di uscita 0) e corrisponde alle prime tre lettere. Ad esempio, echo file|grep fil*risponde con file.
Hastur,

3
@Hastur Il problema è causato dall'espansione del nome file prima dell'espressione regolare. La mia directory di lavoro contiene un file con prefisso fil, ma non un file con prefisso abc, quindi fil * viene sostituito dal nome file, ma abc * rimane invariato.
tmpbin,

Grazie non ci ho pensato. Quando faccio i miei tentativi, li provo in una nuova directory ...
Hastur,

Risposte:


31

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 fseguito iseguito da zero o più lcaratteri. 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ì grepotterrebbero 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.*'.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.