Comment puis-je ajouter une chaîne à la fin de chaque ligne dans Vim?


257

Je veux ajouter *à la fin de chaque ligne dans Vim.

J'ai essayé le code sans succès

:%s/\n/*\n/g

Le vôtre ne fonctionne pas car sur le côté droit de :s///, \ncorrespond à un caractère nul. La section :help sub-replace-specialest pertinente.
doubleDown

Réponses:


355

:%s/$/\*/g

devrait marcher. Il :%s/$/*/gen va de même comme MrWiggles le souligne correctement.


Existe-t-il un moyen d'insérer « » dans la même colonne, car toutes les lignes ne sont pas de même longueur, donc la ligne 1 peut avoir « » dans la 15e colonne, mais la ligne 2 a «*» dans la 25e colonne.
Aman Jain

11
il n'y a qu'un seul EOL par ligne, donc l' gindicateur n'est pas nécessaire.
doubleDown

Je voulais ajouter / au début de chaque ligne: 1, $ s / ^ / \ / g fonctionnait pour moi.
farooqsadiq

@dirkgently Comment puis-je passer une variable de chaîne comme argument à cette commande (vous savez, au lieu du *)?
Matheus Rotta

353

Encore plus court que la commande: search:

:%norm A*

Voilà ce que cela signifie:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
Man, il n'existe pas de fil vi ou vim dont je n'apprends rien. Aujourd'hui, j'apprends la norme. Et comme on dit à Cheers, "Norm!"
smcameron

4
Pour le préfixe, vous devez simplement utiliser 0i *, 0 vous amène au début de la ligne, i pour le mode d'insertion et * pour le *. D:
Rob

7
En tant que VimGolfer, je ne peux pas m'empêcher d'ajouter que l'utilisation I*plutôt que vous 0i*fera économiser une touche.
Jedidiah Hurt du

24
Une autre astuce: Cela fonctionne également pour les gammes. Mettez simplement en surbrillance les lignes en mode visuel et appuyez sur :, cela pré-remplira la commande avec :'<,'>laquelle vous pourrez ensuite effectuer:'<,'>norm A*
Jedidiah Hurt

8
Pour le pré-paiement, utilisez Iplutôt -:%norm I*
Just Lucky Really

42

Aussi:

:g/$/norm A*

Aussi:

gg<Ctrl-v>G$A*<Esc>

Ahhh ... La seconde peut aussi être utilisée avec une sélection de lignes. Agréable!
Tim Fletcher

Pourriez-vous expliquer le premier exemple?
Cody Poll

@CodyPoll gest une globalcommande qui fait quelque chose avec chaque ligne correspondante. $correspond à chaque ligne. Ce pourrait être aussi ^ou .*. La norme exécute les commandes que vous utilisez normalement en mode commande. A*Signifie donc ajouter *à la fin de la ligne.
defhlt

41

Je pense que l'utilisation du mode bloc visuel est une méthode meilleure et plus polyvalente pour faire face à ce type de chose. Voici un exemple:

This is the First line.  
This is the second.  
The third.

Pour insérer "Bonjour tout le monde". (espace + presse-papiers) à la fin de chacune de ces lignes:

  • Sur un caractère de la première ligne, appuyez sur Ctrl-V (ou Ctrl-Q si Ctrl-V est collé).
  • Appuyez sur jj pour étendre le bloc visuel sur trois lignes.
  • Appuyez sur $ pour étendre le bloc visuel jusqu'à la fin de chaque ligne. Appuyez sur A puis sur Espace puis tapez Hello world. + puis Esc.

Le résultat est:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

(exemple de Vim.Wikia.com )


3
Au lieu d'appuyer sur jjon peut frapper Gpour passer à la dernière ligne. Ceci est utile dans les fichiers volumineux, où appuyer jjusqu'à ce que vous atteigniez la dernière ligne n'est pas pratique.
nash

Convenez que le bloc visuel est le plus propre ici, plus extensible aussi
Peter Dolan

Notez que cela ne semble pas fonctionner sur toutes les lignes au début, mais après avoir appuyé sur Echap, il passe et l'ajoute à tous.
Noumenon

Visual Block provoque des problèmes et des erreurs lors de l'utilisation de vim comme extension pour d'autres choses, comme VS Code. Dans ces cas, la recherche et le remplacement demandés par l'utilisateur d'origine constituent l'option fiable.
Brettins

assurez-vous que vous utilisez Capital A, "a" en minuscule ne fonctionne pas.
Jeff Hoye

14

Si vous voulez ajouter Hello world à la fin de chaque ligne:

:%s/$/HelloWorld/

Si vous voulez le faire pour un nombre spécifique de lignes, par exemple de 20 à 30, utilisez:

:20,30s/$/HelloWorld/

Si vous voulez le faire au début de chaque ligne, utilisez:

:20,30s/^/HelloWorld/

6

Vous n'avez pas vraiment besoin du gà la fin. Cela devient donc:

:%s/$/*

Ou si vous voulez juste *la fin, dites les lignes 14-18:

:14,18s/$/*

ou

:14,18norm A*


5

Une option est:

:g/$/s//*

Cela trouvera chaque ancre de fin de ligne et la remplacera par *. Je dis "substitut" mais, en fait, c'est plus un ajout car l'ancre est une chose spéciale plutôt qu'un caractère régulier. Pour plus d'informations, voir Puissance de g - Exemples .


Que signifie s // dans l'expression régulière? Je connais une commande similaire,: g / / / p, (grep). Je suis presque sûr que votre commandement est proche du mien, du moins dans la structure.
Léo Léopold Hertz

1
Le s est un substitut - il remplace l'ancre de fin de ligne par l'astérisque (enfin, ne le remplace pas réellement car c'est un point d'ancrage).
paxdiablo

3
:% s / \ n / * \ r / g

Votre premier est correct ailleurs, mais Vim doit avoir un traitement de nouvelle ligne différent pour une raison quelconque.


Dans ma version de Vim \ n fonctionne, mais cela remplace simplement la nouvelle ligne par un *, joignant efficacement les lignes.
Nathan Fellman

1
Cette commande est vérifiée pour fonctionner correctement sur toutes les versions de Vim que j'ai essayées. Utilisez-vous la version Windows ou quelque chose?

1
%s/\s*$/\*/g

cela fera l'affaire et garantira que les espaces de tête sont ignorés.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.