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

132

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 sans succès:

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

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

Christian
la source
4
C'est un peu hors sujet alors je l'ai mis ici en commentaire mais… je le ferais :%norm ay<CR>.
romainl
2
Dans votre cas (si c'est exactement comme décrit), c'est une option pour: passer à la 2ème colonne avec l, entrer en mode Visual Block avec Ctrl+v, marquer la colonne entière avec Shift+gsuivi de l, puis entrer en mode Insertion avec Shift+iet saisir 'y'. 7 touches, y compris la finition Escpour quitter le mode Insertion. Ne pas publier comme réponse car il ne s'agit pas vraiment de groupes de capture (c'est ce que j'ai recherché quand j'ai trouvé cela). :-)
LAFK dit Réintégrer Monica

Réponses:

224

Une façon de résoudre ce problème consiste à s'assurer que le modèle est entouré de parenthèses échappées :

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

Un peu plus court (et plus magique est d'utiliser -al) \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:

Johnsyweb
la source
41

Si vous ne voulez pas échapper aux groupes de capture avec des barres obliques inverses (c'est ce que vous avez manqué), commencez par \vfaire passer le moteur d'expressions régulières de Vim en mode très magique :

:%s/\v(\w)(\w\w)/\1y\2/g
Ingo Karkat
la source
Ingo, désolé d'avoir placé une question au mauvais endroit: Cette œuvre trouve dans :exmode; y a-t-il un moyen de le faire dans la boîte de dialogue de recherche / remplacement de gvim?
JJoao
3
@JJoao: Non, la boîte de recherche / remplacement est pour la recherche littérale et le remplacement uniquement. Vous ne devriez pas utiliser ça, de toute façon; ce n'est que des roues d'entraînement pour les utilisateurs du Bloc-notes.
Ingo Karkat
Ingo, merci (ce n'est pas pour moi: je suis content d'exmode, mais pour les linguistes collaborateurs dans un projet de dictionnaire): ça marche presque - avec \v...regexp work find; dans la chaîne de remplacement, &fonctionne mais \ sont protégés ( \1\rsont perdus)
JJoao
@JJoao: Oui, c'est aussi ce que j'ai découvert en jouant avec. Je suis toujours sceptique quant à savoir si utiliser Vim sans mode Ex est une bonne idée, mais vous pouvez facilement créer votre propre boîte de dialogue de recherche et de remplacement (alimenté en interne par :s) via inputdialog()et un peu de Vimscript.
Ingo Karkat
Ingo: Merci encore; Je partage votre opinion sceptique. Inputdialg +: s + vimscript est probablement la façon dont find replace de gvim est construit. Pour moi, le \1 \r traitement est un bogue gvim. Je vais essayer de le publier dans une liste spécifique à vim. En attendant, je vais essayer mon seul dialogue d'entrée vimscript.
JJoao
34

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

:%s/^./&y
  • %s applique le modèle à l'ensemble du fichier.
  • ^. correspond au premier caractère de la ligne.
  • &yajoute yaprès le motif.
Juan
la source
13

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

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

Cela fait l'affaire.

Henkersmann
la source