GNU/Linux >> Tutoriales Linux >  >> Linux

Reemplazo de sed multilínea

Respuesta AWK

Con su texto de muestra en un archivo llamado sql , el siguiente patrón (con saltos de línea y sangría para mayor claridad):

awk -v skip=1 '{
    if (skip) { skip=0 }
    else {
        if (/FULLTEXT KEY/) { skip=1; sub(/,$/, "", prevline) }
        print prevline
    }
    prevline=$0
}
END { print prevline }' sql

produce:

CREATE TABLE `table` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default '',
  `description` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

Explicación:

  • Implementamos la "búsqueda anticipada" imprimiendo solo el anteriormente línea encontrada en cada iteración, después de inspeccionar la línea actual.
  • Si la línea actual contiene el FULLTEXT KEY marcador, configuramos una bandera para omitir la impresión de esta línea durante la siguiente iteración. También eliminamos la coma final en la línea anterior que está a punto de imprimirse.
  • Omitimos imprimir una línea inicial vacía (antes de prevline se ha configurado) configurando inicialmente skip a 1 ("verdadero").
  • Nos aseguramos de imprimir la última línea terminando el script con un prevline extra impresión. Tenga en cuenta que la implementación actual asume que esta última línea no es una línea en riesgo de ser saltada, es decir, que no contiene el FULLTEXT KEY marcador.

Original (incompleto) sed responder

Esta respuesta está incompleta y ciertamente en la mayoría de los casos es incorrecta, ya que sed consumirá el flujo de entrada demasiado rápido para el resultado deseado al hacer coincidencias de varias líneas; como se indica en los comentarios, ¡solo funcionará para coincidencias en filas pares! sed no tiene una funcionalidad de búsqueda anticipada "verdadera", por lo que sería mejor usar Python/Perl/etc., o incluso AWK como se indicó anteriormente.

Con su texto de muestra en un archivo llamado sql , el siguiente patrón:

$ sed 'N; s/,\n  FULLTEXT.*//' sql

produce:

CREATE TABLE `table` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default '',
  `description` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

Explicación:

  • N habilita la coincidencia multilínea.
  • \n representa un salto de línea.
  • s/pattern/replacement/ es la sintaxis de reemplazo estándar.
  • .* coincidirá con cualquier cosa hasta el final de la línea actual.

Linux
  1. ¿Cómo reemplazar una cadena en un archivo (s)?

  2. ¿Cómo usar Sed para reemplazar una cadena de varias líneas?

  3. ¿Puede Sed reemplazar los caracteres de nueva línea?

  4. ¿Sed On Osx Insert en cierta línea?

  5. Cómo reemplazar una cadena en varios archivos en la línea de comando de Linux

Los 20 mejores comandos sed para usar

¿Eliminar cadenas de varias líneas?

Tutorial de Unix Sed:anexar, insertar, reemplazar y contar líneas de archivos

Tutorial de Unix Sed:operación de archivos de varias líneas con 6 ejemplos prácticos

¿Cómo se reemplaza el texto similar a sed con python?

Convertir cadena a hexadecimal en la línea de comando