¿Cómo puedo agregar una cadena al final de cada línea en Vim?


257

Quiero agregar *al final de cada línea en Vim.

Probé el código sin éxito

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

El tuyo no funciona porque en el lado derecho de :s///, \ncorresponde a un carácter nulo. La sección :help sub-replace-speciales relevante.
doubleDown

Respuestas:


355

:%s/$/\*/g

Deberia trabajar. Así debería :%s/$/*/gcomo MrWiggles señala correctamente.


¿Hay alguna manera de insertar ' ' en la misma columna, ya que todas las líneas no tienen la misma longitud, por lo que la línea 1 podría tener ' ' en la 15a columna, pero la línea 2 tiene '*' en la 25ta columna?
Aman Jain

11
solo hay 1 EOL por línea, por lo que el gindicador no es necesario.
doubleDown

Quería agregar / al inicio de cada línea: 1, $ s / ^ / \ / g funcionó para mí.
farooqsadiq

@dirkgently ¿Cómo puedo pasar una variable de cadena como argumento a este comando (ya sabes, en lugar de *)?
Matheus Rotta

353

Incluso más corto que el: comando de búsqueda:

:%norm A*

Esto es lo que significa:

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

28
Hombre, no existe un hilo vi o vim del que no aprendo algo. Hoy aprendo sobre la norma. Y como dicen en Cheers, "¡Norma!"
smcameron 01 de

44
Para anteponer, simplemente usaría 0i *, 0 lo lleva al comienzo de la línea, i para el modo de inserción y * para el *. D:
Rob

77
Como VimGolfer, no puedo evitar agregar eso usando en I*lugar de 0i*ahorrarle una pulsación de tecla.
Jedidiah hirió el

24
Otro consejo: esto también funciona para rangos. Solo resalte las líneas en modo visual y presione :, esto completará previamente el comando con el :'<,'>que luego puede hacer:'<,'>norm A*
Jedidiah Hurt el

8
Para anteponer, use Ien su lugar -:%norm I*
Just Lucky Really

42

También:

:g/$/norm A*

También:

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

Ahhh ... El segundo también se puede usar con una selección de líneas. ¡Agradable!
Tim Fletcher el

¿Podría por favor explicar el primer ejemplo?
Cody Poll

@CodyPoll ges un globalcomando que hace algo con cada línea coincidente. $coincide con cada línea. Podría ser también ^o .*. La norma ejecuta comandos que normalmente usa en modo comando. Entonces A*significa agregar *al final de la línea.
defhlt

41

Creo que usar el modo de bloque visual es un método mejor y más versátil para lidiar con este tipo de cosas. Aquí hay un ejemplo:

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

Para insertar "Hola mundo". (espacio + portapapeles) al final de cada una de estas líneas:

  • En un personaje en la primera línea, presione Ctrl-V (o Ctrl-Q si Ctrl-V es pegar).
  • Presione jj para extender el bloque visual sobre tres líneas.
  • Presione $ para extender el bloque visual hasta el final de cada línea. Presiona A, luego espacio y escribe Hola mundo. + entonces Esc.

El resultado es:

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

(ejemplo de Vim.Wikia.com )


3
En lugar de presionar, jjse puede golpear Gpara pasar a la última línea. Esto es útil en archivos grandes, donde presionar jhasta llegar a la última línea no es práctico.
nash

De acuerdo en que el bloqueo visual es más limpio aquí, más extensible también
Peter Dolan

Tenga en cuenta que esto no parece estar funcionando en todas las líneas al principio, pero después de presionar Esc pasa y lo agrega a todos.
Noumenon

Visual Block causa problemas y errores al usar vim como una extensión para otras cosas, como VS Code. En esos casos, la búsqueda y el reemplazo que solicita el usuario original es la opción confiable.
Brettins

asegúrese de usar mayúscula A, la minúscula "a" no funciona.
Jeff Hoye

14

Si desea agregar Hello world al final de cada línea:

:%s/$/HelloWorld/

Si desea hacer esto para un número específico de línea, por ejemplo, use de 20 a 30:

:20,30s/$/HelloWorld/

Si desea hacer esto al comienzo de cada línea, use:

:20,30s/^/HelloWorld/

6

Realmente no necesitas el gal final. Entonces se convierte en:

:%s/$/*

O si solo desea *el final de, diga las líneas 14-18:

:14,18s/$/*

o

:14,18norm A*


5

Una opción es:

:g/$/s//*

Esto encontrará cada ancla de final de línea y la sustituirá por *. Digo "sustituto" pero, en realidad, es más un complemento ya que el ancla es una cosa especial en lugar de un personaje normal. Para obtener más información, consulte Poder de g: ejemplos .


¿Qué significa s // en la expresión regular? Conozco un comando similar: g / / / p, (grep). Estoy bastante seguro de que su comando está cerca del mío, al menos en la estructura.
Léo Léopold Hertz 준영

1
El s es un sustituto: reemplaza el ancla de final de línea con el asterisco (bueno, en realidad no lo reemplaza, ya que es un punto de anclaje).
paxdiablo

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

El primero es correcto en cualquier otro lugar, pero Vim tiene que tener un manejo diferente de nueva línea por alguna razón.


En mi versión de Vim \ n funciona, pero esto simplemente reemplaza la nueva línea con un *, uniendo efectivamente las líneas.
Nathan Fellman

1
Se verifica que este comando funciona bien en todas las versiones de Vim que he probado. ¿Estás usando la versión de Windows o algo así?

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

esto hará el truco y garantizará que se ignoren los espacios iniciales.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.