sed: gibt alle Zeilen zwischen übereinstimmenden Mustern zurück und beendet

sed: gibt alle Zeilen zwischen übereinstimmenden Mustern zurück und beendet

Ich möchte nur die Zeilen extrahieren, die eine bestimmte Tabelle aus einer MySQL-Sicherungsdatei wiederherstellen. Folgendes funktioniert.

zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/p' > account_codes.sql

Da die Sicherungsdatei jedoch 9 GB groß ist, möchte ich die Suche beenden, sobald die Endübereinstimmung gefunden wurde. Daher könnte ich im sed-Teil des obigen Befehls am Ende {p;q} anstelle von p hinzufügen, wie folgt:

zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;q}' > account_codes.sql

Das stoppt, aber nach der Übereinstimmung „von“, nicht nach der Übereinstimmung „bis“. Im Wesentlichen ist die Ausgabe dann nur die erste Zeile des gesamten Blocks.

DROP TABLE IF EXISTS `account_codes`;

Wie kann ich das beheben, sodass der qBefehl nur am Ende wirksam wird, wenn das Muster übereinstimmt?

Antwort1

ich fanddieser Beitrag, mit dem ich meinen sed-Befehl wie folgt geändert habe:

zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;/UNLOCK TABLES/q}' > account_codes.sql

Im Wesentlichen weist es sed an, die übereinstimmenden Zeilen zu suchen und dann zu beenden, wenn es die nächste Zeichenfolge „UNLOCK TABLES“ in der Datei findet.

In der MySQL-Sicherungsdatei steht „UNLOCK TABLES;“, gefolgt von (zum Beispiel)

--
-- Table structure for table `account_table`
--

Wenn ich jedoch den sed-Befehl wie folgt ändere

zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;/-- Table structure for table/q}' > account_codes.sql

sed stoppt nicht, wenn es diesen String findet. Ich habe nicht genug Erfahrung mit sed, um herauszufinden, warum das nicht so ist. Vielleicht kann jemand einen Kommentar hinterlassen, um das zu klären?

verwandte Informationen