Réponse AWK
Avec votre exemple de texte dans un fichier nommé sql , le modèle suivant (avec des sauts de ligne et une indentation pour plus de clarté) :
awk -v skip=1 '{
if (skip) { skip=0 }
else {
if (/FULLTEXT KEY/) { skip=1; sub(/,$/, "", prevline) }
print prevline
}
prevline=$0
}
END { print prevline }' sql
produit :
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 */;
Explication :
- Nous implémentons "l'anticipation" en n'imprimant que le précédemment ligne rencontrée à chaque itération, après avoir inspecté la ligne courante.
- Si la ligne courante contient le
FULLTEXT KEYmarqueur, nous définissons un indicateur pour ignorer l'impression de cette ligne lors de la prochaine itération. Nous supprimons également la virgule de fin sur la ligne précédente qui est sur le point d'être imprimée. - Nous sautons l'impression d'une ligne initiale vide (avant
prevlinea été défini) en définissant initialementskipà1("vrai"). - Nous nous assurons d'imprimer la dernière ligne en terminant le script avec un
prevlinesupplémentaire imprimer. Notez que l'implémentation actuelle suppose que cette dernière ligne n'est pas une ligne risquant d'être sautée, c'est-à-dire qu'elle ne contient pas leFULLTEXT KEYmarqueur.
Original (incomplet) sed répondre
Cette réponse est incomplète et certainement incorrecte dans la plupart des cas, puisque sed consommera le flux d'entrée trop rapidement pour le résultat escompté lors de la correspondance multiligne - comme indiqué dans les commentaires, cela ne fonctionnera que pour les correspondances sur les lignes paires ! sed n'a pas de "véritable" fonctionnalité d'anticipation, nous ferions donc mieux d'utiliser Python/Perl/etc., ou bien AWK comme ci-dessus.
Avec votre exemple de texte dans un fichier nommé sql , le modèle suivant :
$ sed 'N; s/,\n FULLTEXT.*//' sql
produit :
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 */;
Explication :
Npermet la correspondance multiligne.\nreprésente un saut de ligne.s/pattern/replacement/est la syntaxe de remplacement standard..*correspondra à n'importe quoi jusqu'à la fin de la ligne courante.