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.)