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).grep
.Vous avez raison -
\w
fait partie des expressions régulières compatibles PCRE - perl. Cela ne fait cependant pas partie de l'expression rationnelle «standard». http://www.regular-expressions.info/posix.htmlCertaines versions de
sed
peuvent le prendre en charge, mais je dirais que le moyen le plus simple consiste à simplement utiliserperl
ensed
mode en spécifiant l'-p
indicateur. (Avec le-e
). (Plus de détails dansperlrun
)Mais vous n'avez pas besoin de le
[]
contourner dans cet exemple - c'est pour des groupes de choses valides.Ou sous Windows:
Voir
perlre
pour plus de trucs PCRE.Vous pouvez obtenir perl ici: http://www.activestate.com/activeperl/downloads
la source
\w
et[\w]
dans ma question. Je vais le mettre à jour avec les sorties de chaque commande pour indiquer clairement laquelle fonctionne et laquelle ne fonctionne pas. En particulier,sed
comprend\w
, mais pas[\w]
. Aussi, j'ai besoin[\w]
de travailler car je veux utiliser[\w/]
par exemple.perl
peut le faire :).\w
était dans GNU grep (dans les années 80) avant d'être en perl et dans GNU emacs probablement même avant cela.Je soupçonne cela
grep
et jesed
décide différemment quand appliquer le[]
et quand le développer\w
. En perl regex\w
signifie n'importe quel caractère de mot, et[]
définissez un groupe pour appliquer n'importe lequel des caractères à l'intérieur comme une correspondance. Si vous "développez" l'\w
avant,[]
ce sera une classe de caractères de tous les mots. Si, au lieu de cela, vous avez d'[]
abord une classe de caractères avec deux caractères\
,w
elle correspondra donc à n'importe quel modèle contenant un ou plusieurs de ces deux caractères.Il semble donc que
sed
voir le[]
et le traiter comme contenant les caractères exacts à faire correspondre au lieu d'honorer la séquence spéciale au\w
furperl
et à mesuregrep
. Bien sûr, les[]
sont complètement inutiles dans cet exemple, mais on pourrait peut-être imaginer des cas où cela serait important, mais alors vous pourriez le faire fonctionner avec des parenthèses et des or.la source
\
est un code d'échappement, et vous l'utiliseriez pour échapper les délimiteurs. En soi, cela signifie qu'il doit avoir une priorité plus élevée que toute autre chose. Je pense qu'il est plus probable qu'il ne soit pas implémenté car\w
ne fait pas partie de la spécification d'expression régulièreecho whe\\ere | sed -r 's/[\w]+/gone/g
donnegonehegoneere
l'` and
impression qu'il correspond à chacun des w` et fait la substitution