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?
regex
vim
capturing-group
regex-group
Christian
la source
la source
:%norm ay<CR>
.l
, entrer en mode Visual Block avecCtrl+v
, marquer la colonne entière avecShift+g
suivi del
, puis entrer en mode Insertion avecShift+i
et saisir 'y'. 7 touches, y compris la finitionEsc
pour 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). :-)Réponses:
Une façon de résoudre ce problème consiste à s'assurer que le modèle est entouré de parenthèses échappées :
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:Voir:
:help \(
:help \v
la source
Si vous ne voulez pas échapper aux groupes de capture avec des barres obliques inverses (c'est ce que vous avez manqué), commencez par
\v
faire passer le moteur d'expressions régulières de Vim en mode très magique :la source
:exmode
; y a-t-il un moyen de le faire dans la boîte de dialogue de recherche / remplacement de gvim?\v...
regexp work find; dans la chaîne de remplacement,&
fonctionne mais\
sont protégés (\1\r
sont perdus):s
) viainputdialog()
et un peu de Vimscript.\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.Vous pouvez également utiliser ce modèle qui est plus court:
%s
applique le modèle à l'ensemble du fichier.^.
correspond au premier caractère de la ligne.&y
ajoutey
après le motif.la source
Vous devez également échapper à la paranthèse de regroupement:
Cela fait l'affaire.
la source