sed:返回匹配模式之间的所有行并退出

sed:返回匹配模式之间的所有行并退出

我只想提取从 mysql 备份文件恢复特定表的行。以下有效。

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

但是,备份文件的大小为 9GB,因此我希望在找到结尾匹配项后停止搜索。因此,在上述命令的 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 的经验不足,无法弄清楚为什么会这样。也许有人可以发表评论来澄清这一点?

相关内容