Groupes de capture Vim Regex

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é la commande:

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

Que dois-je changer pour que les groupes de capture fonctionnent dans Vim?

Une façon de résoudre ce problème est de s’assurer que le motif est entouré de parenthèses échappées :

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

Légèrement plus court (et plus magique -al) est d’utiliser \v , ce qui signifie que dans le modèle après tous les caractères ASCII sauf '0'-'9' , 'a'-'z' , 'A'-'Z' et '_' ont une signification particulière:

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

Voir:

  • :help \(
  • :help \v

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 d’expression régulière de Vim en mode très magique :

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

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.

Vous devez également échapper au groupement de paranthesis:

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

Cela fait l’affaire.