Mentre utilizziamo * per denotare zero o più caratteri precedenti in grep , utilizziamo *.c per trovare tutti i file C quando lo utilizziamo con ls comando come ls *.c . Qualcuno potrebbe dire come l'uso di * differisce in questi due casi?
Risposta accettata:
Il globbing del nome del file della shell e le espressioni regolari utilizzano alcuni degli stessi caratteri e hanno scopi simili, ma hai ragione, non sono compatibili. Il globbing dei nomi di file è un sistema molto meno potente.
Nel globbing dei nomi dei file:
-
*significa "zero o più caratteri" -
?significa "qualsiasi singolo carattere"
Ma nelle espressioni regolari, devi usare .* per significare "zero o più caratteri" e . significa "qualsiasi singolo carattere". Un ? significa qualcosa di completamente diverso nelle espressioni regolari:zero o un'istanza dell'elemento RE precedente.
Parentesi quadre ([] ) sembrano funzionare allo stesso modo in entrambi i sistemi sul sistema su cui lo sto digitando, almeno per casi semplici. Ciò include cose come le classi di caratteri POSIX (ad es. [:alpha:] ). Detto questo, se hai bisogno che i tuoi comandi funzionino su molti tipi di sistema diversi, ti consiglio di non usare qualcosa che vada oltre le cose elementari come elenchi di caratteri (ad es. [abeq] ) e forse intervalli di caratteri (ad es. [a-c] ).
Queste differenze significano che i due sistemi sono direttamente intercambiabili solo per casi semplici. Se hai bisogno della corrispondenza regolare dei nomi dei file, devi farlo in un altro modo. find -regex è un'opzione. (Nota che c'è anche find -name , a proposito, che usa la sintassi glob.)