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 KEY
marqueur, 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
prevline
a été défini) en définissant initialementskip
à1
("vrai"). - Nous nous assurons d'imprimer la dernière ligne en terminant le script avec un
prevline
supplé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 KEY
marqueur.
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 :
N
permet la correspondance multiligne.\n
repré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.