Comment rechercher un texte dans Vim ?
Appuyez sur la touche /, tapez votre texte de recherche et appuyez sur Entrée. C'est comme la commande less.
Mais cette méthode de recherche de texte ne vous permet pas de remplacer le résultat trouvé.
Permettez-moi de partager comment vous pouvez rechercher et remplacer dans Vim .
:%s/foo/bar/gci
La commande ci-dessus exécutera une recherche insensible à la casse pour trouver toutes les occurrences de votre terme de recherche (foo) avec le nouveau terme (bar). Avec le drapeau c, il demande de confirmer avant de remplacer toute substitution.
Permettez-moi d'entrer dans les détails et d'expliquer les choses plus clairement.
Utiliser la commande substitut pour rechercher et remplacer du texte dans Vim
Je suppose que vous savez déjà que pour exécuter une commande dans Vim, vous devez être en mode normal (également appelé mode de commande). Appuyez sur la touche Échap pour entrer dans ce mode.
Vim a une commande pratique :substitue
, peut également être utilisé avec la version plus courte :s
.
Ci-dessous la syntaxe générale de la commande de substitution :
:[range]s/{pattern}/{string}/[flags] [count]
Décomposons cette syntaxe. Tout ce qui se trouve entre les crochets '[]' est facultatif.
range
:Cette partie de la syntaxe peut être utilisée si vous voulez la substitution entre lesdites lignes. Si vous ne mentionnez pas de plage, cela ne remplacera que le texte sur la ligne actuelle . (J'ai partagé un tableau pour la plage)pattern
:C'est ici que vous spécifiez le texte que vous souhaitez remplacer.string
:Il s'agit de la chaîne qui remplacera le motif.flags
:Pour remplacer toutes les occurrences du motif de recherche, utilisez leg
drapeau. Vous pouvez spécifier si vous voulez que la correspondance ignore la casse, utilisezi
drapeau. Pour confirmer manuellement chaque opération de recherche et de remplacement, utilisez lec
drapeau.count
:nombre de lignes dans lesquelles remplacer le texte.
Plage | Description |
---|---|
. | Ligne actuelle |
$ | Dernière ligne |
% | Toutes les lignes |
x | Numéro de ligne x |
.,+x | De la ligne actuelle jusqu'à x lignes supplémentaires |
Exemples de recherche et de remplacement dans Vim
Passons en revue quelques exemples qui démontrent l'utilisation de la commande substitut dans Vim.
Vous trouverez ci-dessous la capture d'écran du fichier que j'utiliserai pour démontrer l'utilisation de la commande de substitution dans Vim.
Remplacement de texte de base
Pour cet exemple, je me suis assuré que la chaîne 'Hello' apparaissait plusieurs fois dans au moins une ligne et plusieurs fois dans le fichier.
Je veux remplacer 'Hello' par la chaîne 'HI'. Vous trouverez ci-dessous la commande Vim pour le faire :
:%s/Hello/HI/g
Remplacer par confirmation
Pour remplacer du texte, mais souhaitez une confirmation à chaque fois que vous le faites, vous pouvez utiliser le c
dans la commande de substitution.
:%s/Hello/HI/gc
Comme vous pouvez le voir sur la vidéo, Vim me demande une confirmation à chaque fois avant de substituer un motif.
Vous avez également une invite qui ressemble à la ligne suivante :
replace with HI (y/n/a/q/l/^E/^Y)?
Les options de l'invite ont la signification suivante :
- y :oui
- n :non
- a :tous
- q :quitter sans remplacer, mais cela n'annule pas une fois que vous avez déjà remplacé le texte
- l :remplacez ceci et quittez (pensez à 'dernier')
- ^E :Faites défiler vers le haut (ne fonctionne pas dans
vim-tiny
) - ^Y :Faites défiler vers le bas (ne fonctionne pas dans
vim-tiny
)
Remplacement insensible à la casse
Lorsque vous souhaitez remplacer du texte, qu'il soit en majuscule ou en minuscule, dans ce cas (haha), vous devez utiliser le i
flag dans la commande de substitution.
:%s/hello/HI/gi
Si vous remarquez, toutes les occurrences de 'hello' ou 'Hello' et même 'hELLO' sont remplacées par 'HI'. Il s'agit d'une substitution de modèle insensible à la casse.
Chaque 'hello' est remplacé par 'HI' même si la plupart des 'hello' contiennent un 'H' majuscule.
Remplacer le texte sur une seule ligne dans Vim
Pour substituer du texte sur une seule ligne, nous devons spécifier la plage qui limite la portée de la substitution à la ligne actuelle.
Pour cela, il vaut mieux utiliser le .
descripteur de plage.
:.s/Hello/HI/g
Comme vous pouvez le voir, seul le motif de la première ligne a été remplacé car j'ai utilisé le point '.' descripteur de plage.
Astuce bonus :Utiliser un autre délimiteur
En regardant la syntaxe de la commande de substitution, j'ai mentionné que le modèle et la chaîne sont séparés par une barre oblique '/'.
Mais que se passe-t-il si vous avez un texte avec beaucoup de barres obliques dans le motif/la chaîne, comme un chemin, qui se répète partout dans le fichier ? Échapper aux barres obliques peut être fastidieux et parfois facilement manqué.
Ainsi, au lieu d'utiliser le caractère barre oblique comme délimiteur, vous pouvez utiliser un délimiteur différent à la place.
Quelques caractères de délimitation que j'ai vus être utilisés sont #
, _
et @
.
Voici un gif qui montre une démonstration de l'utilisation de @
comme délimiteur au lieu de /
.
Conclusion
La substitution de texte peut être une occurrence courante et Vim vous propose un moyen puissant de rechercher et de remplacer un motif par une chaîne. Vous pouvez même mélanger des regex dans la commande de substitution de Vim.
Si vous souhaitez en savoir plus que les bases de Vim, je vous recommande fortement d'utiliser ce programme de Jovica Ilic.