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 inicialmenteskip
a1
("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 elFULLTEXT 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.