セミコロンを置き換えないことをお勧めします。代わりに、すべてのコマンドを「解析」し、コミットしたい一連のコマンドを配置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
ます。