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: remplacez le texte des lignes 6-10
, 14-18
mais pas de 11-13
.
Réponses:
La
:&&
commande répète la dernière substitution avec les mêmes drapeaux. Vous pouvez lui fournir la ou les plages supplémentaires (et en concaténer autant que vous le souhaitez):Si vous avez de nombreuses plages , je préfère utiliser une boucle:
la source
:6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&
fonctionnera également, lafor
boucle facilite la mémorisation et l'exécution.:
sur les commandes suivantes est facultatif, btw, afin que vous puissiez enregistrer quelques frappes supplémentaires.:&&
me fera économiser des centaines de frappes par semaine. Merci!Remplace tout:
Trouvez chaque occurrence de 'foo' (sur toutes les lignes) et remplacez-la par 'bar'.
Pour des lignes spécifiques:
Remplacez chaque "foo" par "bar" pour toutes les lignes de la ligne 6 à la ligne 10 inclus.
la source
/
, est l'endroit où vous indiquez des indicateurs pour l'opération. Cette commande remplacera normalement la première correspondance sur une ligne; Avec leg
drapeau, il remplacera toutes les occurrences.%
chose fait le travail! Sinon, ce n'est que la première occurrence.%
=> exécutez cette commande sur toutes les lignes.g
=> correspondre à plusieurs occurrences sur la même ligne.En remarque, au lieu d'avoir à taper les numéros de ligne, mettez simplement en surbrillance les lignes où vous souhaitez trouver / remplacer dans l'un des modes visuels:
VISUAL
mode ( V)VISUAL BLOCK
mode ( Ctrl+ V)VISUAL LINE
mode ( Shift+ V, fonctionne mieux dans votre cas)Une fois que vous avez sélectionné les lignes à remplacer, tapez votre commande:
Vous remarquerez que la plage
'<,'>
sera insérée automatiquement pour vous:Ici
'<
signifie simplement la première ligne en surbrillance et'>
signifie la dernière ligne en surbrillance .Notez que le comportement peut être inattendu en
NORMAL
mode:'<
et'>
pointez sur le début et la fin de la dernière surbrillance effectuée dans l'un desVISUAL
modes. Au lieu de cela, enNORMAL
mode, le numéro de ligne spécial.
peut être utilisé, ce qui signifie simplement la ligne actuelle . Par conséquent, vous ne pouvez trouver / remplacer que sur la ligne actuelle comme ceci:Une autre chose à noter est que l'insertion d'une seconde
:
entre la plage et la commande find / replace ne fait aucun mal, en d'autres termes, ces commandes fonctionneront toujours:la source
Vous pouvez le faire avec deux séquences de recherche / remplacement
La deuxième fois, tout ce dont vous avez besoin pour régler est la plage, donc au lieu de tout taper, je rappellerais la dernière commande et éditerais juste la plage
la source
Dans vim si vous ne savez pas quelles lignes seront affectées, utilisez ci-dessous
Changez chaque «foo» en «bar», mais demandez d'abord une confirmation. Appuyez sur 'y' pour oui et sur 'n' pour non. N'oubliez pas de sauvegarder après cela
la source
c
indicateur en plus de spécifier la plage, donc ça:6,10s/<search_string>/<replace_string>/c
marche.c
représenteconfirm
. J'utilise lec
drapeau assez souvent pour éviter de remplacer accidentellement des mots où je ne pensais pas qu'ils existaient également.Exemples de commandes de recherche et de remplacement de VI
Disons que vous souhaitez trouver un mot appelé "foo" et le remplacer par "bar".
Première touche
[Esc]
enfoncéeTapez: (deux-points) suivi de
%s/foo/bar/
et appuyez sur la touche [Entrée]:%s/foo/bar/
la source
:%s/<search_string>/<replace_string>/g
commande remplacera toutes les occurrences du fichier entier. Pas exactement la réponse à la question, mais néanmoins utile :)Nous n'avons pas besoin de prendre la peine de saisir le numéro de ligne actuel.
Si vous souhaitez modifier chaque
foo
à labar
ligne actuelle (.
) et les deux lignes suivantes (+2
), il suffit de faire:Si vous souhaitez confirmer avant d'apporter des modifications, remplacez
g
pargc
:la source
:.,$s/foo/bar/gc
de rechercher et de remplacer à partir de la ligne actuelle jusqu'à la fin du fichier.Rechercher et remplacer
g => recherche globale
c => Demandez d'abord la confirmation
i => insensible à la casse
Si vous souhaitez un remplacement direct sans confirmation, utilisez la commande ci-dessous
Si vous souhaitez une confirmation pour chaque remplacement, exécutez la commande ci-dessous
Demandez d'abord une confirmation, ici la recherche ne respectera pas la casse.
la source
La spécification de la plage par sélection visuelle est correcte, mais lorsqu'il y a des opérations très simples sur seulement quelques lignes qui peuvent ê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 via les commandes standard de 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:
Cela doit être lu comme "Appliquer l'opérateur! À l'intérieur d'un paragraphe". L'opérateur de filtre démarre le mode de commande et insère automatiquement la plage de lignes suivie d'un littéral "!" que vous pouvez supprimer juste après. Si vous appliquez ceci, au paragraphe suivant:
Le résultat après avoir appuyé sur "! Ap" serait comme:
Comme le '.' (point) signifie que la ligne actuelle, la plage entre la ligne actuelle et les 5 lignes suivantes seront utilisées 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 en appliquant 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. C'est-à-dire, si vous souhaitez par la suite sélectionner le plus grand paragraphe de la plage, le '.' le fera bien.
De plus, si vous aimez l'idée d'utiliser des objets texte sémantiques pour sélectionner la plage d'opération, vous pouvez vérifier mon plugin EXtend.vim qui peut faire de même mais de manière plus simple.
la source
Pour répondre à cette question:
:40,50s/foo/bar/g
remplacez foo par bar dans ces lignes entre la 40e ligne et la 50e ligne (inclus), lorsque vous exécutez cette commande, vous pouvez actuellement sur n'importe quelle ligne.
:50,40s/foo/bar/g
fonctionne également, vim vous demandera de confirmer, puis effectuera le remplacement pour vous comme si vous aviez entré la première commande.
:,50s/foo/bar/g
remplacez foo par bar dans ces lignes entre la ligne dans laquelle vous vous trouvez actuellement et la 50e ligne (incluse). (si vous êtes dans une ligne APRÈS la 50e ligne, vim vous demandera de confirmer à nouveau)
Pour clarifier la différence entre vim et le plugin vrapper d'Eclipse:
Notez que dans varpper
:,50s/foo/bar/g
la commande ne fonctionnera PAS.:50,40s/foo/bar/g
fonctionnera sans demander de confirmation.(Pour Vrapper version 0.74.0 ou antérieure).
la source
Supposons que vous souhaitiez 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)
En cela, ce qui précède sera remplacé par (
sys.pkg.mpu.umc.kdk.
).la source
%s
pour modifier l'entrée mais veut savoir comment le faire "semi-globalement" (c'est-à-dire que sa spécification est les lignes 6-10 et 14-18 mais pas les lignes 11- 13)./
, par exemple!
,@
,_
::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g