Espressioni regolari VS Globbing nome file


15

So che le espressioni regolari devono essere utilizzate solo con caratteri e stringhe, ma a volte le trovo nei nomi dei file. La mia domanda è: le regex sono usate solo con caratteri o anche con nomi di file?

Risposte:


19

Le espressioni regolari e il globbing dei nomi dei file sono due cose molto diverse.

Le espressioni regolari vengono utilizzate nei comandi / funzioni per la corrispondenza dei motivi nel testo. Ad esempio nel parametro pattern grepo nei linguaggi di programmazione.

Il globbing del nome file viene utilizzato dalle shell per abbinare i nomi di file e directory utilizzando i caratteri jolly. Le capacità di globbing dipendono dalla shell. Bash, ad esempio, supporta i caratteri jolly come:

  • * abbina 0 o più caratteri
  • ? abbina 1 personaggio
  • [...] abbina un personaggio nel set specificato

Questi caratteri jolly possono sembrare simili alle espressioni regolari, infatti [...]hanno lo stesso significato in globbing e regex. Ma *e ?significano cose diverse in globbing e regex.

In un commento hai scritto:

ma in che modo la differenza dell'interprete * sia che si tratti di joker o regex? per esempio grep a*b a*.txt:?

Facile. Una specie di.

Prima di tutto, la shell cerca di interpretare i caratteri jolly, abbinandoli a nomi di file. Se ci sono file che iniziano con "a" e terminano con "b", la shell sostituirà a*bcon i nomi di file corrispondenti. Lo stesso vale per a*.txt. Se non ci sono nomi di file corrispondenti, la shell passerà gli argomenti grepcome erano, letteralmente.

Tuttavia, il primo parametro di grepdovrebbe essere un modello. Nel 99,999% dei casi d'uso pratici non si desidera che il primo parametro venga interpretato dalla shell. Quindi molto probabilmente l'intenzione era questa:

grep "a*b" a*.txt

Grazie alla citazione a*b, la shell non lo interpreterà usando il globbing e invece lo passerà direttamente a grep. A sua volta, greplo interpreterà come un'espressione regolare (in base alla progettazione).

Per riassumere, la shell interpreta la riga di comando seguendo il suo linguaggio globbing, che utilizza i caratteri jolly. Comandi, i programmi interpretano i loro parametri in qualunque modo siano stati progettati dai loro autori.


4

Se un nome file è una stringa per te, puoi usare regex anche per i nomi dei file. Ad esempio: se vuoi trovare nomi di file corrispondenti a una regex puoi provare:

find ./ -regex '.*[abc][xyz].*'

Il comando cerca i file che hanno a, b o c nel nome seguito da x, y o z. Questo è solo un esempio. Ci sono infinite possibilità.


ma in che modo la differenza dell'interprete * sia che si tratti di joker o regex? per esempio: $ grep a "asterix" b a "asterix" .txt
Hamza,

2
Se lo usi find ./ -name 'a*'usi * come carattere jolly. Quando digiti find ./ -regex 'a*', usi * in una regex. La differenza importante è l'interruttore -nameo -regex.
nessuno il
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.