Reemplazar un patrón con el número de línea actual

15

Me gustaría reemplazar 'x' en este archivo con el número de línea actual. Es decir, cambiar

x
x
x

a

1
2
3

Por ahora, uso una línea Perl:

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

Creo que UltraEdit puede hacerlo con una selección y reemplazo vertical. ¿Se puede hacer esto en vim? (Mi ejemplo aquí asume que 'x' es todo lo que hay en una línea. Pero las líneas en mi archivo real son mucho más complicadas).

yong321
fuente

Respuestas:

23

Sí, vim puede hacer esto! Haga una búsqueda global xy reemplácela por \=printf("%d", line('.'). Por ejemplo:

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

También puede cambiar xa otra búsqueda, si es necesario.

Explicación:

Esto reemplaza cada ocurrencia de x(o lo que sea que busque) con el registro de evaluación \=. Este registro evalúa el código vimscript y devuelve una cadena. En este caso, el código que se evalúa es "Imprimir la línea en la que estamos como un número decimal"

DJMcMayhem
fuente
9

Como mencionó seleccionar y reemplazar verticalmente, también puede hacerlo. Use CtrlVpara seleccionar el bloqueo de texto que desea reemplazar, luego cy escriba 0, para reemplazar eso con 0s. Luego, seleccione esos 0s:

ingrese la descripción de la imagen aquí

Luego presione g<c-a>( g+ Ctrla):

ingrese la descripción de la imagen aquí

Si ha reemplazado una sola columna, puede usarla gvpara volver a seleccionar rápidamente la misma área.

muru
fuente