Unir líneas entre un cierto patrón de texto en Vim

8

Tengo un archivo de texto que se ve así:

A.
text
text
text


A.
more text

more text

A.
more text

Quiero unir todas las líneas entre los "marcadores" A.para que se vea así:

A.texttexttext
A.more textmore text
A.more text

¿Cómo puedo hacer esto en Vim?

vim noob
fuente

Respuestas:

4
:%s/\n\(\(A\.$\)\@!.*\)/\1/

Sustituir una coincidencia de patrón:

  1. nueva línea,
  2. un grupo que contiene de

    1. no la cadena A.seguida directamente por el final de línea, entonces
    2. cualquier personaje hasta el final de la línea

con:

  • todo coincidía excepto la nueva línea inicial (es decir, el grupo anterior),

y hacer esto a nivel mundial.

Daniel Andersson
fuente
1
Gracias. No tengo idea de cómo funciona esa cosa, ¡pero parece que sí! Tendré que diseccionarlo con cuidado. También encontré una solución al unir todas las líneas y luego insertar una nueva línea en "A".
vim noob
@vimnoob: Consulte :help \@!en Vim para obtener más información sobre esa parte. De lo contrario, es sencillo, con suerte, con mi explicación. Un problema con su enfoque es que si " A." aparece en el texto, aunque no como una línea de marcador aislada, se dividirá como si fuera originalmente un marcador. En la práctica, podría no ser un problema (no sé cómo se ve su archivo "real"), pero genéricamente puede causar un comportamiento no deseado si uno no es consciente de esto.
Daniel Andersson
@vimnoob: leí mi respuesta nuevamente, y en caso de que no esté familiarizado con la :%s///sintaxis: es una sintaxis de "buscar y reemplazar" en Vim. :inicia el comando, %especifica todo el búfer como el rango, sinicia una sustitución. /es el delimitador de patrón (se puede usar cualquier otro carácter, pero /es "estándar"). El primero /inicia el patrón de búsqueda, el segundo el patrón de reemplazo y el tercero lo finaliza. Los modificadores finales están disponibles para especificar la insensibilidad a mayúsculas y minúsculas, etc. \1representa el grupo capturado en el patrón de búsqueda. :%s/foo/bar/reemplaza foocon baren el archivo.
Daniel Andersson
Muchas gracias por tu ayuda. ¡Solo necesito investigar esto \ @! parte ya que estoy familiarizado con la búsqueda básica de reemplazo y regexp básico.
vim noob
1
@Reman: La forma más directa en la que pienso inmediatamente es ejecutar una coincidencia de patrón global posterior como :%s/^A\.//. El método en la respuesta no captura los ^A\.patrones en sí (más bien su ausencia), por lo que no puede modificar esas cadenas de una manera obvia.
Daniel Andersson
7

Esto también funciona (cuando la primera línea comienza con A.)

:v/^A/-1j!
Miró
fuente
Eso funciona! Agradable. +1
ZaSter
Sí, en verdad, y dos trucos nuevos para mí, después de la coincidencia antipatrón global (v): la 'j' para unirse y el '!' para unirse sin agregar un espacio. Gracias.
fortboise
@Miro wow! Lo saludo señor. si pudieras explicar por qué funciona, entonces súper! ... también tuve que concatenar las líneas con un carácter de tabulación en el medio ... así que lo que hice fue agregar como / $ / \ t / g tab caracterización al final de cada línea antes de emitir comando anterior ... mejor manera
ihightower