Ersetzen Sie ein Muster durch die aktuelle Zeilennummer

15

Ich möchte 'x' in dieser Datei durch die aktuelle Zeilennummer ersetzen. Das heißt, ändern

x
x
x

zu

1
2
3

Im Moment benutze ich einen Perl-Einzeiler:

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

Ich denke UltraEdit kann es mit einem vertikalen auswählen und ersetzen. Kann das in vim gemacht werden? (Mein Beispiel hier geht davon aus, dass 'x' alles ist, was sich in einer Zeile befindet. Aber die Zeilen in meiner realen Datei sind viel komplizierter.)

yong321
quelle

Antworten:

23

Ja, das kann vim! Führen Sie eine globale Suche durch xund ersetzen Sie sie durch \=printf("%d", line('.'). Beispielsweise:

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

Sie können xbei Bedarf auch zu einer anderen Suche wechseln .

Erläuterung:

Dies ersetzt jedes Vorkommen von x(oder was auch immer Sie suchen) mit dem Auswertungsregister \=. Dieses Register wertet den Vimscript-Code aus und gibt eine Zeichenfolge zurück. In diesem Fall lautet der Code, der ausgewertet wird, "Drucken Sie die Zeile, in der wir uns befinden, als Dezimalzahl".

DJMcMayhem
quelle
9

Da Sie das vertikale Auswählen und Ersetzen erwähnt haben, können Sie dies auch tun. Wählen Sie CtrlVmit die Textsperre aus, die Sie ersetzen möchten, cund geben Sie 0 ein, um diese durch 0 zu ersetzen. Wählen Sie dann diese 0 aus:

Bildbeschreibung hier eingeben

Dann drücken Sie g<c-a>( g+ Ctrla):

Bildbeschreibung hier eingeben

Wenn Sie eine einzelne Spalte ersetzt haben, können Sie gvdenselben Bereich schnell erneut auswählen.

muru
quelle