Parfois, jutilise :s
avec une expression rationnelle compliquée qui peut être correcte ou non, ou je « m pas sûr si je veux remplacer toutes les correspondances.
Est-il possible de dire à Vim de confirmer chaque correspondance trouvée avant quelle ne remplace réellement le texte?
Réponse
Oui! Utilisez lindicateur c
pour :substitute
. De :help substitute
:
[c] Confirm each substitution. Vim highlights the matching string (with hl-IncSearch). You can type: :s_c "y" to substitute this match "l" to substitute this match and then quit ("last") "n" to skip this match <Esc> to quit substituting "a" to substitute this and all remaining matches {not in Vi} "q" to quit substituting {not in Vi} CTRL-E to scroll the screen up {not in Vi, not available when compiled without the +insert_expand feature} CTRL-Y to scroll the screen down {not in Vi, not available when compiled without the +insert_expand feature}
Lexemple dutilisation est simple comme bonjour:
%s/old/new/gc
Ceci est très utile, mais je ne savais pas à ce sujet jusquà il y a 2 semaines 🙂 Et il est même disponible en ol « vi 🙂
Astuce bonus: vous pouvez également utiliser :set nowrapscan
; cela empêche Vim de senrouler vers le haut lorsquil touche le bas. « Jai trouvé cela particulièrement utile lors de lutilisation de lindicateur c
.
Commentaires
- Jajouterais également que si vous souhaitez remplacer toutes les instances de
old
dans la même ligne (pas seulement la première occurrence), vous devez ajouterg
à la fin de la commande donc au total vous aurez%s/old/new/gc
- Oh, ouais; jai
set gdefault
jai donc tendance à oublier de lajouter dans les exemples @ e271p314 😅
Réponse
En plus de ce que Carpetsmoker a dit:
Le paramètre &incsearch
(set incsearch
) dans Vim est vraiment utile. Vous pouvez utilisez-le avec une astuce utile et peu connue.
Lastuce consiste à essayer votre regex complexe en utilisant simplement /
ou ?
. Vim utilisera le paramètre &incsearch
pour afficher les correspondances de manière interactive. Onc e vous « êtes satisfait de lexpression régulière, vous pouvez utiliser :%s//replacement
pour que vim utilise la recherche précédente.
Remarquez comment la partie de //
est vide (cest là que vous mettez le texte à rechercher). Si vous laissez ce champ vide, vous dites à Vim dutiliser lexpression régulière de recherche précédente. Avec cela, vous pouvez taper une expression régulière complexe avec /
et bénéficier de tous les avantages de set incsearch
, puis utiliser %s//replacement
pour exécuter réellement la recherche et le remplacement.
Si vous voulez quelque chose de similaire à incsearch pour les commandes :s
, consultez vim-over , mais je préfère simplement utiliser la méthode native de Vim.
Commentaires
Réponse
Ma substitution interactive préférée est de rechercher en utilisant / et de parcourir les correspondances en utilisant n .
Puis sélectionnez correspondance en utilisant g n puis s à remplacer le texte par ce que je veux .
Et répétez en passant à la correspondance suivante et en appuyant sur .
Commentaires
- Cest une très belle astuce, car elle est: (1) interactive, (2) vous pouvez aller à la correspondance précédente si vous avez sauté accidentellement (quelque chose que vous ne pouvez pas faire avec
:s/old/new/gc
).
Réponse
qui vous permet de prévisualiser le résultat de la commande :s
pendant que vous le saisissez.
Réponse
Pour le bénéfice de tout le monde, incsearch
a été mis à jour dans la vim8 pour afficher également laperçu lorsque vous tapez le modèle
:%s/pattern/replace/
puis appuyez suru
pour annuler, vous pouvez voir les parties que Vim a modifiées si vous avez activéhlsearch
. Et vous pouvez à nouveau remplacer ce texte par^R
.