¿Cómo unir dos líneas en vi?

169

Tengo dos líneas en un archivo de texto como a continuación:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

Quiero agregar las dos líneas en vi como a continuación:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

La segunda línea se eliminó y el contenido de la segunda línea se agregó a la primera línea.

¿Cómo podría hacerlo usando el modo de comando en vi?

Vijay
fuente

Respuestas:

310

Shift+ Jelimina el carácter de cambio de línea de la línea actual, por lo que al presionar "J" en cualquier lugar de la línea puede combinar la línea actual y la línea siguiente de la manera que desee.

GJ
fuente
9
la mayúscula J une líneas, la minúscula mueve el cursor
44
Esa era una J mayúscula, no una J minúscula; de ahí Shift-J.
Jonathan Leffler
28
"elimina el carácter de cambio de línea de la línea actual" es una forma bastante incómoda de describir lo que hace J, y tampoco es realmente correcto. J "une" esta línea a la siguiente. En el proceso, elimina la nueva línea, pero también manipula los espacios en blanco de otras maneras.
Laurence Gonsalves
55
Jaja. GJin vimse moverá a la última línea y luego intentará unirla a la siguiente línea, el único lugar donde un comando de unión no tiene sentido. Sí, esto me pareció divertido :-)
Alok Singhal
2
¡Todavía no puedo darme cuenta de que necesitaba ir a StackOverflow para unir dos líneas con este editor!
Manitra Andriamitondra
59

Vi o Vim?

De todos modos, el siguiente comando funciona para Vim en modo 'no compatible'. Es decir, supongo, casi puro vi.

:join!

Si quieres hacerlo desde el comando normal usa

gJ

Con 'gJ' puede unir líneas como están, sin agregar o eliminar espacios en blanco:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

Resultado:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

Con el comando 'J' tendrás:

S<Switch_ID>_F<File type> _ID<ID number>_T<date+time>_O<Original File name>.DAT

Observe el espacio entre type>y _ID.

Maxim Kim
fuente
2
Solo quiero señalar que g/pattern/joinfunciona en VIM mientras g/pattern/Jque no. Podría ayudar a algunas personas futuras.
jisaacstone
Me gusta su combinación con el patrón, sin embargo, une dos líneas con espacios en blanco. ¿De todos modos unir dos líneas con un patrón sin espacios en blanco?
David.Chu.ca
g / patrón / unirse! Parece hacer eso.
fortboise
1
¿Puede ser más complicado, por favor! :-)
Johannes Overmann
22

Esto debería hacerlo:

J

samg
fuente
66
'J' da espacio adicional al unir líneas.
Maxim Kim
3
@MaximKim: Y esta es la razón . Tenga en cuenta que :h Jle dirá cómo deshabilitar esa función.
antes del
2
Úselo gJsi no desea que vim agregue un espacio al unir las líneas
qwertzguy
17

En vi, J(eso es Shift+ J) o :joindebería hacer lo que quieras, en su mayor parte. Tenga en cuenta que ajustan los espacios en blanco.En particular, terminará con un espacio entre las dos líneas unidas en muchos casos, y si la segunda línea tiene sangría, esa sangría se eliminará antes de unirse.

En Vim también puedes usar gJ( G, luego Shift+ J) o :join!. Estos unirán líneas sin hacer ningún ajuste de espacio en blanco.

En Vim, ver :help Jpara más información.

Laurence Gonsalves
fuente
Una advertencia cuando se utiliza gJy Jes que tanto chang el cursor hasta el punto de unión, pero :join!y :joinno haga.
SergioAraujo
4

Simplemente reemplace el " \n" con "".

En vi / Vim para cada línea del documento:

%s/>\n_/>_/g

Si desea confirmar cada reemplazo:

%s/>\n_/>_/gc
Carsten C.
fuente
3

Si desea unir las líneas seleccionadas (está en modo visual), simplemente presione gJpara unir sus líneas sin espacios en absoluto.

Esto se describe con mayor detalle en el sitio vi / Vim Stack Exchange .

Brad Parks
fuente
1

Presione Shift+ 4("$") en la primera línea, luego Shift+ j("J").

Y si quieres ayuda, entra en vi y luego presiona F1.

ghostdog74
fuente
3
$ se mueve al final de la fila, pero no es necesario para J
1
No tiene que estar al final de la línea para que J una las líneas.
Jonathan Leffler
1
Presionar $ no es necesario, en realidad.
Laurence Gonsalves
1
@laurence .pressing $ asegura que el cursor se coloque justo al lado de la nueva carta de línea y esto es imprescindible.
Vijay
1

En Vim también puedes usar gJ.

ََ

joshy
fuente
1

Otra forma de unir dos líneas sin colocar el cursor en esa línea es:

:6,6s#\n##

Aquí 6 es el número de línea al que se unirá otra línea. Para mostrar el número de línea, use:set nu .

Si estamos en el cursor donde se debe unir la siguiente línea, entonces:

:s#\n##

En ambos casos no necesitamos glike :s#\n##g, porque en una línea solo \nexiste una .

vusan
fuente
Es más fácil de usar Shift+Vpara seleccionar todas las líneas que se van a unir, excepto la última, y ​​luego, :'<,'>s/\n/, /en este ejemplo, unir líneas al colocar una coma y un espacio al final de cada una. Tenga en cuenta que cuando se selecciona algo y escribimos :en modo normal, entonces '<,'>aparece automáticamente en la línea de comando.
Evgeni Sergeev
Bueno para unir líneas múltiples seleccionadas con delimitador preferido. ¿Encontraste un error tipográfico ... en modo normal o en modo visual?
vusan