Diversi strumenti e relative versioni supportano diverse varianti di espressioni regolari. La documentazione di ciascuno ti dirà cosa supportano.
Esistono degli standard in modo da poter contare su un set minimo di funzionalità disponibili in tutte le applicazioni conformi.
Ad esempio, tutte le implementazioni moderne di sed
e grep
implementano espressioni regolari di base come specificato da POSIX (almeno una versione o l'altra dello standard, ma tale standard non si è evoluto molto in questo senso negli ultimi decenni).
In POSIX BRE ed ERE, hai la [:alnum:]
classe di caratteri. Che corrisponde a lettere e cifre nella tua locale (nota che spesso include molto più che a a-zA-Z0-9
meno che la locale non sia C).
Così:
grep -x '[[:alnum:]_]\{1,\}'
corrisponde a uno o più allarmi o _.
[\w]
è richiesto da POSIX per corrispondere a barra rovesciata o w
. Quindi non troverai un grep
o sed
implementazione dove è disponibile (a meno che tramite opzioni non standard).
Il comportamento da \w
solo non è specificato da POSIX, quindi le implementazioni sono autorizzate a fare ciò che vogliono. GNU l'ha grep
aggiunto molto tempo fa.
GNU grep
aveva il suo motore regexp, tuttavia ora usa quello di GNU libc (anche se incorpora una sua copia).
Ha lo scopo di abbinare alnum e trattino basso nel tuo locale. Tuttavia, al momento ha un bug in quanto corrisponde solo a caratteri a byte singolo (ad esempio, non é in una localizzazione UTF-8 anche se è chiaramente una lettera e anche se corrisponde a é in tutti i locali in cui é è un singolo personaggio).
Esiste anche un \w
operatore regexp in perl regexp e in PCRE. PCRE / perl non sono espressioni regolari POSIX, sono solo un'altra cosa.
Ora, con il modo in cui GNU grep -P
usa PCRE, ha lo stesso problema di senza -P
. Può essere aggirato lì dappertutto usando (*UCP)
(sebbene ciò abbia anche effetti collaterali in locali non UTF8).
GNU sed
usa anche i regex di GNU libc per i propri regexps. Lo usa in modo tale che non abbia lo stesso bug di GNU grep
.
GNU sed
non supporta i PCRE. Ci sono alcune prove nel codice che è stato tentato prima, ma non sembra più essere all'ordine del giorno.
Se vuoi le espressioni regolari di Perl, usa perl
comunque.
Altrimenti, direi che invece di provare a fare affidamento su una falsa funzionalità non standard della tua specifica implementazione di sed
/ grep
, sarebbe meglio attenersi allo standard e utilizzare [_[:alnum:]]
.
[_[:alnum:]]
è una bella soluzione che mi permette di estenderlo come[\w/]
([_[:alnum:]/]
in quel caso).