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
.
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
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.
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
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
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 /
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
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
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.
/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.
).