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?
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
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
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 à la paranthèse de groupement:
:%s/\(\w\)\(\w\w\)/\1y\2/g
Ça fait l'affaire.