セミコロンを置き換えないことをお勧めします。代わりに、すべてのコマンドを「解析」し、コミットしたい一連のコマンドを配置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) の一連の文字 ( ではない)に置き換え、;続い;て string BEGIN;、一致するコマンドのブロック ( で表される&)、および文字列\nCOMMIT;\n\n(読みやすくするために改行を使用) に置き換えます。
最後に、パターン空間の内容を で出力しpます。