In che modo le espressioni regolari differiscono dai caratteri jolly utilizzati per filtrare i file


15

Mentre usiamo *per indicare zero o più caratteri precedenti in grep, usiamo *.cper trovare tutti i file C quando lo usiamo con il lscomando like ls *.c. Qualcuno potrebbe dire come l'uso di *differisce in questi due casi?

Risposte:


30

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


2
Non so che si chiamasse globbing :)
user3539

3
Inoltre, ci sono vari gusti di regex. Non tutte le regex sono create allo stesso modo! E hai molti altri sistemi di corrispondenza dei modelli, come SQL like , dove '%'significa '*'.
Mr Lister,

4
Due tipi principali di regexp sono POSIX e PCRE (Perl compatibile RE). Il secondo è meno prolisso e ha alcune caratteristiche in più. Gli strumenti e le shell Unix usano generalmente POSIX, la maggior parte dei linguaggi di programmazione con regexps integrati (tranne la shell) usano PCRE. Fai attenzione alla differenza quando leggi materiale online.
Riccioli d'oro

11

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 *.txtsia facilmente comprensibile da utenti occasionali, l'analogo .*\.txtè qualcosa di più mirato a utenti / programmatori esperti, per non parlare ^.*\.txt$...


2
Un altro motivo per la parte "perché": la velocità. Le espressioni regolari sono più lente: pastebin.com/3iNCgkE3
manatwork

3
*.txtnon è 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?
un CVn
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.