AWK-Antwort
Mit Ihrem Beispieltext in einer Datei namens sql , das folgende Muster (mit Zeilenumbrüchen und Einrückungen zur Verdeutlichung):
awk -v skip=1 '{
if (skip) { skip=0 }
else {
if (/FULLTEXT KEY/) { skip=1; sub(/,$/, "", prevline) }
print prevline
}
prevline=$0
}
END { print prevline }' sql
produziert:
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 */;
Erklärung:
- Wir implementieren "Lookahead", indem wir nur vorher drucken angetroffene Zeile bei jeder Iteration, nachdem die aktuelle Zeile überprüft wurde.
- Falls die aktuelle Zeile den
FULLTEXT KEYenthält marker setzen wir ein Flag, um das Drucken dieser Zeile während der nächsten Iteration zu überspringen. Wir entfernen auch das abschließende Komma in der vorherigen Zeile, die gedruckt werden soll. - Wir überspringen das Drucken einer leeren Anfangszeile (vor
prevlineeingestellt wurde) durch anfängliches Setzen vonskipbis1("wahr"). - Wir stellen sicher, dass die letzte Zeile gedruckt wird, indem wir das Skript mit einem zusätzlichen
prevlinebeenden drucken. Beachten Sie, dass die aktuelle Implementierung davon ausgeht, dass diese letzte Zeile keine Zeile ist, die übersprungen werden könnte, d. h. dass sie nicht denFULLTEXT KEYenthält Markierung.
Original (unvollständig) sed Antwort
Diese Antwort ist unvollständig und sicherlich in den meisten Fällen falsch, seit sed verbraucht den Eingabestrom zu schnell für das beabsichtigte Ergebnis, wenn mehrzeilige Übereinstimmungen durchgeführt werden - wie in den Kommentaren erwähnt, funktioniert dies nur für Übereinstimmungen in geradzahligen Zeilen! sed hat keine "echte" Lookahead-Funktionalität, also wären wir besser dran, Python/Perl/etc. oder tatsächlich AWK wie oben zu verwenden.
Mit Ihrem Beispieltext in einer Datei namens sql , das folgende Muster:
$ sed 'N; s/,\n FULLTEXT.*//' sql
produziert:
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 */;
Erklärung:
Naktiviert den mehrzeiligen Abgleich.\nstellt einen Zeilenumbruch dar.s/pattern/replacement/ist die Standard-Ersetzungssyntax..*findet alles bis zum Ende der aktuellen Zeile.