Rechercher et remplacer

Astuce 31 Monobook imprimable Précédent Suivant

créé en 2001 · complexité basique · version 6.0

Vim fournit le :s (substitute) commande pour rechercher et remplacer; cette astuce montre des exemples de substitution. Sur certains systèmes, gvim a Rechercher et remplacer dans le menu Edition (: help: promptrepl), mais il est plus facile dutiliser la commande :s en raison de son historique de ligne de commande et de sa capacité à insérer texte (par exemple, le mot sous le curseur) dans les champs de recherche ou de remplacement.

Recherche de base et remplacement

La commande :substitute recherche un modèle de texte et le remplace par une chaîne de texte. Il existe de nombreuses options, mais voici ce que vous voulez probablement:

:s/foo/bar/gTrouvez chaque occurrence de « foo » (dans la ligne actuelle uniquement) et remplacez-la par « bar « .:%s/foo/bar/gTrouvez chaque occurrence de « foo » (dans toutes les lignes) et remplacez-la par « bar ».:%s/foo/bar/gcRemplacez chaque « foo » par « bar », mais demandez dabord une confirmation.:%s/\<foo\>/bar/gcRemplacez uniquement les mots entiers correspondant exactement « foo » par « bar »; demandez confirmation.:%s/foo/bar/gciRemplacez chaque « foo » (insensible à la casse en raison de lindicateuri) en « bar »; demandez confirmation.:%s/foo\c/bar/gcest le même parce que\crend la recherche insensible à la casse. Cela peut être souhaité après avoir utilisé:set noignorecasepour rendre les recherches sensibles à la casse (valeur par défaut).:%s/foo/bar/gcIRemplacez chaque « foo » (sensible à la casse en raison de lindicateurI) par « bar »; demandez confirmation.:%s/foo\C/bar/gcest identique car\Crend la recherche sensible à la casse. Cela peut être souhaité après avoir utilisé:set ignorecasepour rendre les recherches insensibles à la casse.

Lindicateur g signifie global – chaque occurrence de la ligne est modifiée, plutôt que la première. Cette astuce suppose le paramètre par défaut pour loption "gdefault" et "edcompatible" (désactivée), qui nécessite que loption g doit être inclus dans %s///g pour effectuer un remplacement global. Lutilisation de :set gdefault crée de la confusion car alors %s/// est global, alors que %s///g ne lest pas (cest-à-dire , g renverse sa signification).

Lorsque vous utilisez lindicateur c, vous devez confirmer pour chaque correspondance ce que à faire. Vim affichera quelque chose comme: replace with foobar (y/n/a/q/l/^E/^Y)? (où foobar est la pièce de remplacement de la commande :s/.../.../. Vous pouvez saisir y ce qui signifie remplacer cette correspondance, n pour ignorer cette correspondance, a pour la remplacer et toutes les correspondances restantes ( « all » restants), q pour quitter la commande, l pour remplacer cette correspondance et quitter (pensez à « dernier »), ^E pour faire défiler lécran vers le haut en maintenant la touche Ctrl et en appuyant sur E et ^Y pour faire défiler lécran vers le bas en maintenant la touche Ctrl et en appuyant sur Y. Cependant, les deux derniers choix ne sont disponibles que si votre Vim est une construction normale, grande ou énorme ou si la fonction insert_expand a été activée au moment de la compilation (recherchez +insert_expand dans la sortie de :version).

De plus, lors de lutilisation de lindicateur c, Vim passera à t La première correspondance quil trouve à partir du haut du tampon et vous invite à confirmer pour effectuer le remplacement sur cette correspondance. Vim applique le groupe de surlignages IncSearch au texte correspondant pour vous donner une indication visuelle de la correspondance sur laquelle il fonctionne (défini sur reverse par défaut pour les trois types de termes à partir de Vim 7.3). De plus, si plusieurs correspondances sont trouvées et que la mise en évidence de la recherche est activée avec :set hlsearch, Vim met en évidence les correspondances restantes avec le groupe de surbrillance Search . Si vous utilisez la mise en surbrillance de recherche, vous devez vous assurer que ces deux groupes de surbrillance sont visuellement distincts ou vous ne pourrez pas facilement dire quelle correspondance Vim vous invite à remplacer.

Détails

Plage de recherche:

Remarque: à partir de Vim 7.3, substitutions appliquées à une plage définie par des marques ou une sélection visuelle (qui utilise un type spécial de marques « < et « >) ne sont pas délimités par la position de colonne des marques par défaut. Au lieu de cela, Vim applique la substitution à toute la ligne sur laquelle chaque marque apparaît à moins que\%Vatome est utilisé dans le modèle comme::"<,">s/\%Vfoo/bar/g.

Lors de la recherche:

.,*,\,spécifie une / collection. Les plages de caractères peuvent être représentées par un-; par exemple, une lettre a, b, c ou le chiffre 1 peut être mis en correspondance avec. Nier la collection aveccorrespond à nimporte quel caractère sauf a, b, c ou 1.\{#\}est utilisé pour la répétition./foo.\{2\}correspondra à foo et aux deux caractères suivants. Le\nest pas requis à la fermeture}donc/foo.\{2}fera la même chose.\(foo\)fait une référence arrière à foo. Les parenthèses sans échappements sont littéralement mises en correspondance. Ici, le\est requis pour la fermeture\).

Lors du remplacement:

\rest une nouvelle ligne,\nest un octet nul (0x00).\&est une esperluette (& est le texte qui correspond au modèle de recherche).\0insère le texte correspondant au motif entier.\1insère le texte de la première référence arrière.\2insère la deuxième référence arrière, et ainsi de suite.

Vous pouvez utiliser dautres délimiteurs avec le substitut:

:s#http://www.example.com/index.html#http://example.com/#

Enregistrez la saisie en utilisant \zs et \ze pour définir le début et la fin dun motif. Par exemple, au lieu de:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/

Utilisez:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

En utilisant le mot actuel ou registres

:%s//bar/gRemplacez chaque correspondance du dernier modèle de recherche par « bar ». Par exemple, vous pouvez dabord placer le curseur sur le motfoopuis appuyer sur*pour rechercher ce mot. Le substitut ci-dessus changerait alors tous les mots correspondant exactement à «foo» en «bar».:%s/foo/<c-r><c-w>/gRemplacez chaque occurrence de « foo » par le mot sous le curseur.<c-r><c-w>signifie que vous appuyez sur Ctrl-R puis Ctrl-W. Le mot sous le curseur sera inséré comme si vous laviez tapé.:%s/foo/<c-r><c-a>/gRemplacez chaque occurrence de « foo » par le MOT sous le curseur (délimité par des espaces).<c-r><c-a>signifie que vous appuyez sur Ctrl-R puis Ctrl-A. Le MOT sous le curseur sera inséré comme si vous laviez tapé.:%s/foo/<c-r>a/gRemplacez chaque occurrence de « foo » par le contenu du registre « a ».<c-r>asignifie que vous appuyez sur Ctrl-R puisa. Le contenu du registre « a » sera inséré comme si vous laviez tapé.:%s/foo/<c-r>0/gComme ci-dessus, en utilisant le registre 0 qui contient le texte de la commande yank la plus récente. Des exemples de commandes yank (copie) sontyi(qui copie le texte entre parenthèses autour du curseur, ety$qui copie le texte du curseur à la fin de la ligne. Après une commande yank qui na pas spécifié de registre de destination, le texte copié peut être saisi en appuyant sur Ctrl-R puis0.:%s/foo/\=@a/gRemplacez chaque occurrence de « foo » par le contenu du registre « a ».\=@aest une référence au registre « a ». Le contenu du registre « a » nest pas affiché dans la commande. Ceci est utile si le registre contient plusieurs lignes de texte.:%s//<c-r>//gRemplacez chaque correspondance du dernier modèle de recherche par le registre/(le dernier modèle de recherche). Après avoir appuyé sur Ctrl-R puis/pour insérer le dernier modèle de recherche (et avant dappuyer sur Entrée pour exécuter la commande), vous pouvez modifier le texte pour apporter les modifications requises.:%s/<c-r>*/bar/gRemplacez toutes les occurrences du texte dans le presse-papiers système (dans le registre*) par « bar » (voir lexemple suivant si multiligne) . Sur certains systèmes, il suffit de sélectionner du texte (dans Vim ou une autre application) pour placer ce texte dans le registre*.:%s/<c-r>a/bar/gRemplacez toutes les occurrences du texte dans le registre « a » par « bar ».

<c-r>asignifie que vous appuyez sur Ctrl-R puisa. Le contenu du registre « a » sera inséré comme si vous laviez tapé. Toutes les nouvelles lignes dans le registre « a » sont insérées en tant que^Met ne sont pas trouvées. La recherche fonctionne si chaque^Mest remplacé manuellement par « \ n » (deux caractères: barre oblique inverse, « n »). Ce remplacement peut être effectué pendant que vous tapez la commande::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/gLe"\n"(guillemets doubles) représente le saut de ligne à un caractère; le"\\n"(guillemets simples) représente deux barres obliques inverses suivies de « n« .La fonctionsubstitute()est évaluée par le registre dexpression<c-r>=(Ctrl-R=); il remplace chaque nouvelle ligne par une seule barre oblique inverse suivie de « n« .<CR>indique que vous appuyez sur Entrée pour terminer lexpression=.:%s/<c-r>0/bar/gComme ci-dessus, en utilisant le registre 0 qui contient le texte de la commande yank la plus récente.

Voir Coller les registres dans les commandes de recherche ou deux-points au lieu dutiliser le presse-papiers.

Exemples supplémentaires

:%s/foo/bar/Sur chaque ligne, remplacez la première occurrence de « foo » avec « bar ».:%s/.*\zsfoo/bar/Sur chaque ligne, remplacez la dernière occurrence de « foo » par « bar ».:%s/\<foo\>//gSur chaque ligne, supprimez toutes les occurrences du mot entier « foo ».:%s/\<foo\>.*//Sur chaque ligne, supprimez le mot entier « foo » et tout le texte suivant (jusquà la fin de la ligne).:%s/\<foo\>.\{5}//Sur chaque ligne, supprimez la première occurrence du mot entier « foo » et les cinq caractères suivants.:%s/\<foo\>\zs.*//Sur chaque ligne, supprimez tout le texte après le mot entier « foo » (jusquà la fin de la ligne).:%s/.*\<foo\>//Sur chaque ligne, supprimez le mot entier « foo » et tout le texte précédent (à partir du début de la ligne).:%s/.*\ze\<foo\>//Sur chaque ligne, supprimez tout le texte précédant le mot entier « foo » (à partir du début de la ligne).:%s/.*\(\<foo\>\).*/\1/Sur chaque ligne, supprimez tout le texte précédant et suivant le mot entier « foo ».:%s/\<foo\(bar\)\@!/toto/gSur chaque ligne, remplacez chaque occurrence de « foo » (qui commence un mot et nest pas suivi de « bar ») par « toto ».:s/^\(\w\)/\u\1/Si le premier caractère au début de la ligne courante est uniquement en minuscules, mettez-le en majuscule en utilisant\u(voir changement de casse des caractères ).:%s/\(.*\n\)\{5\}/&\r/Insérez une ligne vide toutes les 5 lignes. Le modèle recherche

\(.*\n\)(toute ligne y compris sa fin de ligne) répété cinq fois (\{5\}). Le remplacement est&(le texte trouvé), suivi de\r(nouvelle ligne).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/gObtenez une liste de résultats de recherche. (la liste doit exister) Définit lindicateurmodified, à cause du remplacement, mais le contenu reste inchangé. Remarque: Avec un Vim assez récent (version 7.3.627 ou supérieure), vous pouvez simplifier cela en::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gnCela présente lavantage que le tampon ne sera pas marqué comme modifié et non Un état dannulation supplémentaire est créé. Lexpression de la pièce de remplacement est exécutée dans le bac à sable et nest pas autorisée à modifier le tampon.

Cas particuliers

Pour remplacer les motifs par le texte respectant la casse, Michael Geddes  » Le plugin keepcase peut être utilisé, par exemple:

:%SubstituteCase/\cHello/goodBye/gRemplacez « Hello hello helLo HELLO » par « Goodbye goodbye goodBye GOODBYE »

Pour changer les décalages dans un fichier patch (numéro de ligne dun bloc), ce petit extrait de code peut être utilisé:

s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g

Utile lorsque lon veut supprimer certains blocs dun patch, sans que le patch ait à se plaindre des différences de décalage.

Remarque Je devrais essayer de rendre lexpression plus compacte, mais je ne sais pas comment faire sans avoir la possibilité de modifier les lignes indésirables.

Voir aussi: utiliser un substitut

  • 63 Appliquer des substituts à un bloc visuel
  • 81 Remplacer facilement des caractères et des lignes
  • 159 Séquence de touches Enregistrement de remplacement et de recherche
  • 406 Autres délimiteurs pour le remplacement commande
  • 438 Rechercher et remplacer dans une sélection visuelle
  • 464 Rechercher et remplacer le mot sous le curseur
  • 479 Remplacer sans taper
  • 573 Répéter un substitut à partir de la position actuelle du curseur
  • 605 Remplacer un mot par le texte copié
  • 654 Caractères spéciaux dans la commande de remplacement
  • 755 Utiliser une expression dans commande de substitution
  • 808 Remplacer un bloc visuel de texte par un autre bloc de ce type
  • 915 Utiliser g au lieu de substituer
  • 971 Remplacer par des nombres incrémentiels
  • 1114 Incrémenter et remplacer létape
  • 1501 Remplacer la dernière recherche

Voir aussi: remplacer dans les tampons / fichiers

  • 382 Rechercher et remplacer dans plusieurs tampons
  • : help: substitute
  • : help cmdline-r anges
  • : modèle daide
  • : help « gdefault »
  • : registres daide

À FAIRE
Le une grande section «voir aussi» peut être utile aux lecteurs. Nous devons fusionner certains des conseils connexes (mais ne compliquez pas trop le résultat). Jai inclus les numéros des conseils pour aider les éditeurs à suivre.

Vous voulez une courte section mentionnant que de simples substituts sont souvent les meilleurs géré en recherchant puis en changeant manuellement (et en appuyant sur . pour répéter la dernière modification). De plus, vous pouvez décider comment changer chaque instance.Voir Copier ou modifier un résultat de recherche pour une technique dans laquelle vous pouvez appuyer sur n pour trouver linstance suivante, puis tapez cs pour modifier le résultat de recherche. à nimporte quoi.

Y a-t-il eu récemment un changement dans le fonctionnement de% s? Dune manière ou dune autre, je peux utiliser à la fois < cr > et \ = @ comme remplaçants, mais je ne peux « pas les utiliser comme recherches et remplacements.

Si vous décrivez exactement ce que vous faites et ce qui se passe, je pourrais peut-être vous aider, mais voir poser des questions. JohnBeckett (discussion) 02:15, 1er juin 2019 (UTC)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *