Différents outils et versions de ceux-ci prennent en charge différentes variantes d'expressions régulières. La documentation de chacun vous indiquera ce qu'ils prennent en charge.
Il existe des normes permettant de se fier à un ensemble minimal de fonctionnalités disponibles dans toutes les applications conformes.
Par exemple, toutes les implémentations modernes sed
et grep
implémentent des expressions régulières de base comme spécifié par POSIX (au moins une version ou l'autre de la norme, mais cette norme n'a pas beaucoup évolué à cet égard au cours des dernières décennies).
Dans POSIX BRE et ERE, vous avez la [:alnum:]
classe de caractères. Cela correspond aux lettres et aux chiffres de votre environnement local (notez que cela inclut souvent beaucoup plus que a-zA-Z0-9
si l'environnement local n'est pas C).
Alors:
grep -x '[[:alnum:]_]\{1,\}'
correspond à un ou plusieurs alnums ou _.
[\w]
est requis par POSIX pour correspondre à la barre oblique inverse ou w
. Vous ne trouverez donc pas d' implémentation grep
ou sed
là où elle est disponible (sauf via des options non standard).
Le comportement pour \w
seul n'est pas spécifié par POSIX, donc les implémentations sont autorisées à faire ce qu'elles veulent. GNU a grep
ajouté cela il y a longtemps.
GNU grep
avait son propre moteur d'expression régulière, mais il utilise maintenant celui de la bibliothèque GNU (bien qu'il intègre sa propre copie).
Il est destiné à faire correspondre les alnums et les traits de soulignement dans votre environnement local. Cependant, il a actuellement un bogue en ce qu'il ne correspond qu'à des caractères à un octet (par exemple, pas é dans un environnement local UTF-8 même s'il s'agit clairement d'une lettre et même s'il correspond à é dans tous les environnements locaux où é est un seul personnage).
Il existe également un \w
opérateur regexp dans perl regexp et dans PCRE. PCRE / perl ne sont pas des expressions régulières POSIX, c'est juste une tout autre chose.
Maintenant, avec la façon dont GNU grep -P
utilise PCRE, il a le même problème que sans -P
. Cela peut être résolu là-bas en utilisant (*UCP)
(bien que cela ait également des effets secondaires dans les environnements locaux non UTF8).
GNU sed
utilise également les expressions régulières de la bibliothèque GNU pour ses propres expressions régulières. Il l'utilise de telle manière qu'il n'a pas le même bug que GNU grep
.
GNU sed
ne prend pas en charge les PCRE. Il y a des preuves dans le code qu'il a déjà été tenté, mais il ne semble plus être à l'ordre du jour.
Si vous voulez les expressions régulières de Perl, utilisez-les perl
.
Sinon, je dirais que plutôt que d'essayer de s'appuyer sur une fausse fonctionnalité non standard de votre implémentation particulière de sed
/ grep
, il serait préférable de s'en tenir à la norme et à l'utilisation [_[:alnum:]]
.
[_[:alnum:]]
est une belle solution de contournement qui me permet de l'étendre comme[\w/]
([_[:alnum:]/]
dans ce cas).