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

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.


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.


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


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.


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


1

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

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


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

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 .


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