¿Cómo dividir una línea en varias líneas de manera eficiente?

11

He estado recibiendo datos registrados en un archivo de texto que es solo una línea larga con cada valor separado por un espacio. ¿Hay un comando o conjunto de comandos que dividirán una línea en varias líneas?

Dom
fuente

Respuestas:

21

Simplemente puede reemplazar cualquier espacio consecutivo en la línea con una nueva línea usando el comando :s/\s\+/\r/g. \s\+significa uno o más caracteres de espacio en blanco, y \res una nueva línea, vea :help :substitutey :help regexppara más detalles. Si ejecuta el comando en una línea como:

foo bar baz

Usted obtiene:

foo
bar
baz

Si ha hlsearchhabilitado y no desea saturar su pantalla con espacios resaltados en todas partes, puede escribir una pequeña función como la siguiente para evitarlo:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction
toro2k
fuente
"Si no desea saturar su pantalla con espacios resaltados en todas partes", esto supone demasiado sobre la configuración del OP.
romainl
@romainl ¿Mejor?
toro2k
1
Sí, es mejor IMO.
romainl
2
Lo es \r, mira :help s/\r. Podría ser reemplazado por una escritura literal de nueva línea <c-v><cr>. En este contexto \nes un carácter nulo, ver :help s/\n.
toro2k
1
replaces the content of the register- ¿Qué registro?
stillanoob
5

El uso vimde la sustitución es probablemente una de las mejores formas de realizar su tarea, pero también puede usar una macro. Supongamos que tenemos los siguientes datos, con el cursor en algún lugar de la línea 1:

1 a b c d e f
~

Comenzando en modo normal, al golpear qqcomenzará a grabar una macro invocable a través de @q. Cualquier cosa escrita después qqserá repetible a través de la llamada mencionada anteriormente. Nuestro objetivo es grabar comandos normales que serán lo suficientemente generales como para permitir una repetición perfecta.

Por lo tanto, podemos escribir 0para llevar el cursor al inicio de la línea y luego fspacemover el cursor al primer espacio. Esto nos permite escribir renter, lo que resulta en:

1 a
2 b c d e f
~

Golpear qahora es una buena idea ya que nuestra macro reutilizable está lista para la repetición. De manera algo arbitraria, notamos que quedan 4 espacios para reemplazar con nuevas líneas. Por lo tanto, al golpear, 4@qrepetimos la qmacro 4 veces, lo que resulta en:

1 a
2 b
3 c
4 d
5 e
6 f
~

Tenga en cuenta que debido a la manera hemos creado la macro, habría sido seguro para repetir el comando más de 9000 veces, ya que sólo afectaría a la línea actual, y puesto que no había plazas a la derecha de la última entrada de datos, fspacelo hará 'bien' falla, evitando que los datos sean reemplazados por nuevas líneas.

Entonces, para repetir desde el principio:

qq0fspacerenterq9001@q

Proporciona nuestro resultado.

HAL 9001
fuente
1
Me encanta que tengas una 9001tecla en tu teclado para escribir tu nombre de usuario rápidamente.
Rico
4

La forma más fácil que he encontrado para dividir líneas en Vim es el comando de modo normal gq(escriba ambas letras en rápida sucesión en modo normal o visual).

En modo visual, dividirá lo que esté seleccionado, en modo normal, siga gqcon un movimiento.

Por ejemplo, gqldividirá una línea al ancho establecido actualmente. Para establecer que el ancho de las líneas divididas sea diferente de su configuración actual, puede usar :set textwidth=n, donde nestá la cantidad de caracteres que desea en una línea, por ejemplo, 10y volver a su ancho normal cuando haya terminado.

Obtuve esta información de un video de Youtube de Kholidfu que muestra cómo unir y dividir líneas en modo normal usando un movimiento.

vdicarlo
fuente