sed(またはawk):n行目ごとに "commit;"新しい行を追加します。ただし、次の行がパターンで始まる場合にのみ適用されます。

sed(またはawk):n行目ごとに

非常に大きなSQLファイルがあります。たとえば、100000行ごとに "commit;"という新しい行を追加したいと思います。

これは簡単ですが、SQLには改行文字を持つCLOBとBLOBが含まれています。

この行内に新しい行が作成されていないことを確認する必要があります。

つまり、n番目の行ごとに「コミット」を行う必要がありますが、次の行が「INSERT INTO」で始まる場合にのみ可能です。

入力する:

INSERT INTO X ..... );
INSERT INTO X ..... );
INSERT INTO X .....foo bar
foo bar foo
bar foo
bar);
INSERT INTO X ..... );
INSERT INTO X ..... );
INSERT INTO X .....foo
bar
foo bar);
INSERT INTO X ..... );

期待される出力(この例では、2行目ごとにコミットが追加されると仮定):

INSERT INTO X ..... );
INSERT INTO X ..... );
commit;
INSERT INTO X .....foo bar
foo bar foo
bar foo
bar);
INSERT INTO X ..... );
commit;
INSERT INTO X ..... );
INSERT INTO X .....foo
bar
foo bar);
commit;
INSERT INTO xxx ..... );

アドバイスありがとうございます:)

ベストアンサー1

commit以下は、3番目の挿入ごとに貼り付ける例です。

sed '0~2{:a;N;/;$/!ba;s/$/\ncommit;/}'

各挿入は行の終わりで終わると仮定します;。 (行の末尾にスペースがある行がある場合は、\s*その後に追加する必要があります。;

ロジックは、3つの行をつかみ、;最後に1つがあることを確認し、最後に;行が得られるまでさらに多くの行をリンクすることです。それからcommit;

その行を追加した後、次の行を処理し続けます。

必要に応じて行数を自由に調整してください。

おすすめ記事