我建议不要尝试替换分号。取而代之的是,“解析”所有命令,BEGIN
并COMMIT
围绕您要提交的一堆命令。使用 sed 这很容易。如果你有这个文件:
$ cat my.sql
INSERT INTO table VALUES (1);
INSERT INTO table VALUES (2);
INSERT INTO table VALUES (3);
INSERT INTO table VALUES (4);
INSERT INTO table VALUES (5);
INSERT INTO table VALUES (6);
INSERT INTO table VALUES (7);
INSERT INTO table VALUES (8);
INSERT INTO table VALUES (9);
INSERT INTO table VALUES (10);
只需运行以下命令:
$ sed -n 'H;${x;s/\([^;]*;\)\{,3\}/BEGIN;&\nCOMMIT;\n\n/g;p}' my.sql
BEGIN;
INSERT INTO table VALUES (1);
INSERT INTO table VALUES (2);
INSERT INTO table VALUES (3);
COMMIT;
BEGIN;
INSERT INTO table VALUES (4);
INSERT INTO table VALUES (5);
INSERT INTO table VALUES (6);
COMMIT;
BEGIN;
INSERT INTO table VALUES (7);
INSERT INTO table VALUES (8);
INSERT INTO table VALUES (9);
COMMIT;
BEGIN;
INSERT INTO table VALUES (10);
COMMIT;
(为了清楚起见,这里我使用 3 作为块的大小。对于“包含”100 个命令的块,替换\{,3\}
为 \{,100\}
)
它有什么作用?
首先,我们禁止打印带有 的行-n
。现在 sed 只会在我们命令它显式打印它们时打印它们。
现在,对于每一行,我们将该行附加到具有H
.
在最后一行(地址$
),我们执行一个命令块(从 开始到{
结束}
)。第一个命令,x
交换保持空间(现在包含所有文件)和模式空间的内容。
在此之后,我们用s///
n (0 < n <= 3) 系列字符(没有一个;
);
替换字符串BEGIN;
,匹配的命令块(由 表示&
)和字符串\nCOMMIT;\n\n
(为了更好的可读性而使用换行符。
最后,我们用 打印模式空间的内容p
。