L'operatore grep "+" non funziona


31

Questo

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."

genera questo:

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz

ma questo:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."

non genera nulla.

Perché? Ho appena cambiato *in +. Non è simile? L'operatore ha +solo bisogno di almeno una partita e *zero o più.

Risposte:


36

Questo perché grep(senza argomenti) funziona solo con espressioni regolari standard. +fa parte delle espressioni regolari estese, quindi per usarlo devi usare grep -Eo egrep:

ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."

Inoltre, puoi farlo solo se non vuoi usare espressioni regolari estese:

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."

Grazie. Ora ho risolto il problema, ma mi chiedevo perché "+" non funziona. Adesso lo so. Grazie ancora.
Marko,

11

Per elaborare la risposta di MiJyns, anche "caratteri speciali" come + funzionano in regex standard, ma è necessario sfuggirli con una barra rovesciata. Potresti dire, le aspettative di default sono invertite tra regex standard ed esteso:

In regex standard, i caratteri corrispondono letteralmente per impostazione predefinita. Ad esempio, in grep "ab+"+ è un + letterale. Il regex troverebbe ad esempio "ab + ab", ma non "abbbb". Per usare il "significato speciale" di +, devi evitarlo. Quindi grep "ab\+"troverei "abbb", ma non più "ab + ab". Perché nell'ultimo esempio, il + è interpretato come il quantificatore "uno o più di quello", in quel caso "uno o più b".

In regex esteso è esattamente il contrario. Qui, è necessario sfuggire a "personaggi speciali" per essere trattati alla lettera. Quindi grep -E "ab+"trova "abbb", ma non "ab + ab". Se sfuggi al +, viene letteralmente abbinato. Quindi grep -E "ab\+"trova "ab + ab", ma non "abbb".


1
Che pasticcio ereditato ... ;-) come la magia e la supermagic re in vim. Urgh. Il prezzo da pagare per la retrocompatibilità ...
Rmano
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.