sed: вернуть все строки между совпадающими шаблонами и выйти

sed: вернуть все строки между совпадающими шаблонами и выйти

Я хочу извлечь только те строки, которые восстановят определенную таблицу из файла резервной копии mysql. Следующее работает.

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

Однако размер файла резервной копии составляет 9 ГБ, поэтому я хотел бы прекратить поиск, как только будет найдено конечное совпадение. Поэтому в части sed приведенной выше команды я мог бы добавить {p;q} вместо p в конце, как здесь:

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

Это останавливает, но после совпадения "from", а не "to". По сути, вывод — это только первая строка всего блока.

DROP TABLE IF EXISTS `account_codes`;

Как это исправить, чтобы qкоманда вступила в силу только в конце сопоставления шаблона?

решение1

я нашелэта почта, который я использовал для изменения моей команды sed следующим образом:

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

По сути, он сообщает sed, что нужно найти совпадающие строки, а затем выйти, когда в файле будет найдена следующая строка «UNLOCK TABLES».

В файле резервной копии MySQL после строки «UNLOCK TABLES;» следует (например)

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

Однако, если я изменю команду sed следующим образом:

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 не останавливается, когда находит эту строку. У меня недостаточно опыта работы с sed, чтобы понять, почему. Может быть, кто-то может оставить комментарий, чтобы прояснить это?

Связанный контент