Rechercher et remplacer des chaînes dans vim sur plusieurs lignes

Je peux faire :%s/<search_string>/<replace_string>/g pour remplacer une chaîne dans un fichier, ou :s/<search_string>/<replace_string>/ pour remplacer dans la ligne actuelle.

Comment puis-je sélectionner et remplacer des mots à partir de lignes sélectives dans vim?

Exemple: remplacer le texte des lignes 6-10, 14-18 mais pas de 11-13.

225
demandé sur mu 無 2013-11-15 10:34:20

9 réponses

La commande :&& répète la dernière substitution avec les mêmes indicateurs. Vous pouvez lui fournir la (les) Plage (S) supplémentaire (s) (et en concaténer autant que vous le souhaitez):

:6,10s/<search_string>/<replace_string>/g | 14,18&&

Si vous avez de nombreuses plages, je préfère utiliser une boucle:

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor
178
répondu Ingo Karkat 2013-11-15 16:36:55

Remplacer Tout:

:%s/foo/bar/g

Trouvez chaque occurrence de 'foo' (dans toutes les lignes) et remplacez-la par 'bar'.

Pour des lignes spécifiques:

:6,10s/foo/bar/g

Changez chaque 'foo' en ' bar ' pour toutes les lignes de la ligne 6 à la ligne 10 inclusivement.

226
répondu Jayanth Ramachandran 2016-09-19 08:02:05

Comme note de côté, au lieu d'avoir à taper les numéros de ligne, il suffit de mettre en surbrillance les lignes où vous voulez trouver / remplacer dans l'un des modes visuels:

  • VISUAL mode (V)
  • VISUAL BLOCK mode (Ctrl+V)
  • VISUAL LINE mode (Maj+V, qui fonctionne le mieux dans votre cas)

Une Fois que vous avez sélectionné les lignes à remplacer, tapez votre commande:

:s/<search_string>/<replace_string>/g

Vous remarquerez que le gamme '<,'> sera inséré automatiquement pour vous:

:'<,'>s/<search_string>/<replace_string>/g

Ici '< signifie simplement la première ligne en surbrillance, et '> signifie dernière ligne en surbrillance.

Notez que le comportement peut être inattendu quand NORMAL mode: '< et '> pointent vers le début et la fin de la dernière surbrillance effectuée dans l'un des VISUAL modes. Au lieu de cela, dans NORMAL mode, le numéro de ligne spécial . peut être utilisé, ce qui signifie simplement courant ligne. Par conséquent, vous pouvez trouver / remplacer uniquement sur la ligne actuelle comme ceci:

:.s/<search_string>/<replace_string>/g

Une autre chose à noter est que l'insertion d'un second : entre la plage et la commande find/replace ne fait aucun mal, en d'autres termes, ces commandes fonctionneront toujours:

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g
36
répondu Attila O. 2015-06-02 14:04:26

Vous pouvez le faire avec deux séquences de recherche/remplacement

  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g

La deuxième fois, tout ce que vous devez ajuster est la plage, donc au lieu de tout taper, je rappellerais la dernière commande et éditerais juste la plage

27
répondu Lieven Keersmaekers 2014-09-05 17:25:30

VI rechercher et remplacer des exemples de commandes

Disons que vous souhaitez trouver un mot appelé "foo" et le remplacer par"bar".

Première touche [Esc]

Tapez: (deux-points) suivi de %s / foo / bar / et appuyez sur la touche [Entrée]. :%s / foo / bar /

9
répondu dinesh vishe 2016-09-24 20:04:18

Dans vim si vous ne savez pas quelles lignes seront affectées, utilisez ci-dessous

 :%s/foo/bar/gc  

Changez chaque ' foo ' en 'bar' , mais demandez d'abord une confirmation. Appuyez sur " y " pour oui et n pour non. N'oubliez pas d'enregistrer après cela

:wq
3
répondu SMJ 2018-09-05 06:15:27

Nous n'avons pas besoin de prendre la peine d'entrer le numéro de ligne actuel.

Si vous souhaitez changer chaque foo en bar pour la ligne actuelle (.) et les deux lignes suivantes (+2), Faites simplement:

:.,+2s/foo/bar/g

Si vous souhaitez confirmer avant que des modifications soient apportées, remplacez g par gc:

:.,+2s/foo/bar/gc
1
répondu andykong10 2018-09-24 21:55:45

Spécifier la plage par sélection visuelle est ok mais quand il y a très opérations simples sur seulement quelques lignes qui peuvent être sélectionnées par un l'opérateur le mieux serait d'appliquer ces commandes en tant qu'opérateurs.

Cela ne peut malheureusement pas être fait à travers les commandes standards vim. Vous pourriez faire une sorte de solution de contournement en utilisant le ! (filtre) opérateur et tout objet texte. Pour exemple, pour appliquer l'opération à un paragraphe, vous pouvez faire:

!ip

Cela doit être lu comme " appliquer l'opérateur ! l'intérieur d'un paragraphe". Filtrage l'opérateur démarre le mode de commande et insère automatiquement la plage de lignes suivi par un littéral "!"que vous pouvez supprimer juste après. Si vous appliquez ceci, au paragraphe suivant:

1
2  Repellendus qui velit vel ullam!
3  ipsam sint modi! velit ipsam sint
4  modi! Debitis dolorum distinctio
5  mollitia vel ullam! Repellendus qui
6  Debitis dolorum distinctio mollitia
7  vel ullam! ipsam
8
9  More text around here

Le résultat après avoir appuyé sur"!ap" serait comme:

:.,.+5

Comme le'."(point) signifie la ligne actuelle, la plage entre le courant la ligne et les 5 lignes après seront utilisées pour l'opération. Maintenant vous pouvez ajouter la commande de substitution de la même manière que précédemment.

La mauvaise partie est que ce n'est pas plus facile que de sélectionner le texte pour le dernier l'application de l'opérateur. La bonne partie est que cela peut répéter l'insertion de la plage pour d'autres plages de texte similaires (dans ce cas, paragraphes) avec sightly taille différente. C'est-à-dire, si vous voulez plus tard sélectionner la plage plus grande le paragraphe le '.'à sa droite.

Aussi, si vous aimez l'idée d'utiliser des objets de texte sémantique pour sélectionner gamme de fonctionnement, vous pouvez vérifier mon plugin étendre.vim {[17] } qui peut faire la même chose mais en plus facilement.

0
répondu Saul Axel Martinez Ortiz 2018-09-02 07:10:13
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal

Supposons que vous vouliez remplacer ce qui précède par d'autres informations.

COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)

Dans ce cas, ce qui précède sera remplacé par (sys.pkg.mpu.umc.kdk.).

-4
répondu Sai Ganesh 2016-09-21 23:39:39