¿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
Léo Léopold Hertz 준영
fuente
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.

Dirkgently
fuente
¿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
Cyber ​​Oliveira
fuente
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>
Brian Carper
fuente
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 )

nicole
fuente
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/
utkarsh
fuente
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*
Pedro Norwego
fuente
5

... y para anteponer (agregar el comienzo de) cada línea con *,

%s/^/*/g
JohnnyCoder
fuente
Esto no responde la pregunta.
doubleDown
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 .

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


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

ng.
fuente