web-dev-qa-db-fra.com

Groupes de capture Vim Regex [bau -> byau: ceu -> cyeu]

J'ai une liste de mots:

bau
ceu
diu
fou
gau

Je veux transformer cette liste en:

byau
cyeu
dyiu
fyou
gyau

J'ai essayé sans succès la commande:

:%s/(\w)(\w\w)/\1y\2/g

Étant donné que cela ne fonctionne pas, que dois-je changer pour que les groupes de capture de regex fonctionnent dans Vim?

112
Christian

Une façon de résoudre ce problème est de s’assurer que le modèle est entouré de échappements :

:%s/\(\w\)\(\w\w\)/\1y\2/g

Légèrement plus courte (et plus la magie - al) consiste à utiliser \v, ce qui signifie que dans le modèle qui suit tout ASCII caractères sauf '0'-'9', 'a'-'z', 'A'-'Z' et '_' ont une signification particulière:

:%s/\v(\w)(\w\w)/\1y\2/g

Voir:

198
Johnsyweb

Si vous ne voulez pas échapper aux groupes de capture avec des barres obliques inverses (c'est ce que vous avez manqué), ajoutez \v pour transformer le moteur des expressions rationnelles de Vim en mode très magique:

:%s/\v(\w)(\w\w)/\1y\2/g
39
Ingo Karkat

Vous pouvez également utiliser ce modèle qui est plus court:

:%s/^./&y
  • %s applique le motif à tout le fichier.
  • ^. correspond au premier caractère de la ligne.
  • &y ajoute le y après le motif.
28
Juan

Vous devez également échapper à la paranthèse de groupement:

:%s/\(\w\)\(\w\w\)/\1y\2/g

Ça fait l'affaire.

12
Henkersmann