¿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.