Risposte:
Globbing del nome del file Shell e le espressioni regolari usano 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 nome del file globbing:
*
significa "zero o più caratteri"
?
significa "qualsiasi singolo carattere"
Ma nelle regex devi usare .*
"zero o più caratteri", e.
significa "qualsiasi singolo carattere". A ?
significa qualcosa di molto diverso nelle regex: zero o un'istanza dell'elemento RE precedente.
Le parentesi quadre ( []
) sembrano funzionare allo stesso modo in entrambi i sistemi sul sistema su cui sto scrivendo, 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 diversi tipi di sistema, ti consiglio di non usare nulla al di là di cose elementari come elenchi di caratteri (ad es.[abeq]
) e forse intervalli di caratteri (ad esempio [a-c]
).
Queste differenze significano che i due sistemi sono direttamente intercambiabili solo per casi semplici. Se hai bisogno della corrispondenza regex dei nomi dei file, devi farlo in un altro modo. find -regex
è un'opzione. (Si noti che esiste anche find -name
, tra l'altro, che utilizza la sintassi glob.)
'%'
significa '*'
.
Risposta alla domanda espressa nel titolo originale:
Perché le espressioni regolari differiscono da quelle utilizzate per filtrare i file?
L'espansione del nome file precede le espressioni regolari, esisteva già con la maggior parte dei sistemi operativi (caratteri jolly / joker) ed è molto più semplice e intuitiva di quest'ultima.
Sebbene *.txt
sia facilmente comprensibile da utenti occasionali, l'analogo .*\.txt
è qualcosa di più mirato a utenti / programmatori esperti, per non parlare ^.*\.txt$
...
*.txt
non è uguale .*\.txt
, è (principalmente) uguale .*\.txt$
perché non ci può essere nulla dopo il .txt
(almeno assumendo ragionevoli globbing dei nomi di file). Forse anche ^.*\.txt$
un po 'a seconda dell'uso. Dimostra il tuo punto?