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.