Remplacer un motif par le numéro de ligne actuel

15

Je voudrais remplacer «x» dans ce fichier par le numéro de ligne actuel. Autrement dit, changer

x
x
x

à

1
2
3

Pour l'instant, j'utilise un one-liner Perl:

perl -pi -e '$x=$.; s/x/$x/' myfile.txt

Je pense qu'UltraEdit peut le faire avec une sélection verticale et un remplacement. Cela peut-il être fait dans vim? (Mon exemple ici suppose que «x» est tout ce qu'il y a sur une seule ligne. Mais les lignes de mon vrai fichier sont beaucoup plus compliquées.)

yong321
la source

Réponses:

23

Oui, vim peut le faire! Effectuez une recherche globale xet remplacez-la par \=printf("%d", line('.'). Par exemple:

:%s/x/\=printf("%d", line('.'))

Vous pouvez également passer xà une autre recherche, si nécessaire.

Explication:

Cela remplace chaque occurrence de x(ou tout ce que vous recherchez) par le registre d'évaluation \=. Ce registre évalue le code vimscript et renvoie une chaîne. Dans ce cas, le code évalué est "Imprimer la ligne sur laquelle nous sommes en tant que nombre décimal"

James
la source
9

Puisque vous avez mentionné la sélection et le remplacement vertical, vous pouvez également le faire. Utilisez CtrlVpour sélectionner le verrou de texte que vous souhaitez remplacer, puis ctapez 0 pour le remplacer par 0. Ensuite, sélectionnez ces 0:

entrez la description de l'image ici

Appuyez ensuite sur g<c-a>( g+ Ctrla):

entrez la description de l'image ici

Si vous avez remplacé une seule colonne, vous pouvez utiliser gvpour resélectionner rapidement la même zone.

muru
la source