web-dev-qa-db-fra.com

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 le remplacer dans la ligne courante.

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

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

245
mu 無

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

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

Si vous avez plusieurs plages cependant, je préférerais utiliser une boucle:

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor
193
Ingo Karkat

Remplace 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

Modifiez chaque "foo" en "bar" pour toutes les lignes de la ligne 6 à la ligne 10 incluse.

259

En guise de remarque, au lieu de devoir saisir les numéros de ligne, mettez en surbrillance les lignes où vous souhaitez rechercher/remplacer dans l'un des modes visuels:

  • VISUAL mode (V)
  • VISUAL BLOCK mode (Ctrl+V)
  • VISUAL LINE mode (Shift+V, 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 noterez que la plage '<,'> sera insérée automatiquement pour vous:

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

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

Notez que le comportement peut être inattendu lorsque NORMAL mode: '< et '> pointent au début et à la fin de la dernière surbrillance effectuée dans l'un des modes VISUAL. Au lieu du mode NORMAL, le numéro de ligne spécial . peut être utilisé, ce qui signifie simplement la ligne actuelle . 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 nuit pas, en d'autres termes, ces commandes continueront à fonctionner:

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g
45
Attila O.

Vous pouvez le faire avec deux séquences rechercher/remplacer

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

La deuxième fois, il vous suffit de régler la plage. Au lieu de la saisir entièrement, je rappelle la dernière commande et modifie uniquement la plage

27

Exemples de commandes de recherche et de remplacement de VI

Disons que vous voudriez trouver une Parole appelée “foo” et la remplacer par “bar”.

Premier appui sur la touche [Esc]

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

:%s/foo/bar/

11
arnav

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

 :%s/foo/bar/gc  

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

:wq
8
SMJ

Nous n'avons pas besoin de nous soucier de saisir 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 les modifications ne soient apportées, remplacez g par gc

:.,+2s/foo/bar/gc
3
andykong10

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

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

!ip

Cela doit être lu comme "Appliquez l'opérateur! À l'intérieur d'un paragraphe". L'opérateur filter Démarre en mode commande et insère automatiquement la plage de lignes Suivie d'un littéral "!" que vous pouvez supprimer juste après . Si vous appliquez cela, 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 en cours, la plage entre la ligne en cours et les 5 lignes suivantes sera utilisée pour l'opération. Vous pouvez maintenant 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 ce dernier Appliquer 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, les paragraphes) avec une taille visiblement différente. Autrement dit, si vous souhaitez ultérieurement sélectionner une plage plus grande, le paragraphe "." va à droite.

De plus, si vous aimez l'idée d'utiliser des objets texte sémantiques pour sélectionner la plage d'opérations , Vous pouvez consulter mon plugin EXtend.vim qui peut faire la même chose Mais de manière plus simple. .