sed: 一致するパターン間のすべての行を返して終了します

sed: 一致するパターン間のすべての行を返して終了します

mysql バックアップ ファイルから特定のテーブルを復元する行のみを抽出したいです。次の方法が機能します。

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

ただし、バックアップ ファイルのサイズは 9 GB なので、最後の一致が見つかったら検索を停止したいと思います。そのため、上記のコマンドの sed 部分で、末尾に p の代わりに {p;q} を追加できます。

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 の経験が足りないので、なぜ停止しないのかわかりません。誰かコメントを残して、これを明確にしていただけますか?

関連情報