0

DDLとDMLを含む複数の.sqlファイルがあります。

1)1セットのファイルには、以下のようにDDL(テーブルの作成...)、DML(Merge into ....)、そして再びDDL(テーブルの削除...)が続きます。

    CREATE TABLE T1 (col1 ...);
    Merge into T2 using T1.....;
    Drop table T1;

2)2番目のセットでは、上記のパターンの複数の繰り返しが次のようになります。

    CREATE TABLE T1 (col1 ...);
    Merge into T2 using T1.....;
    CREATE TABLE T3 (col1 ...);
    Merge into T4 using T1 and T3.....;
    Drop table T1;
    Drop table T3;

各ソースファイルから2つのファイルを作成する必要があります。1つはすべてのDDLを使用し、もう1つはすべてのDMLを使用します。最初にCREATEとセミコロンの間を検索してDDLファイルに直接送信し、次にマージとセミコロンの間を検索してDMLファイルに直接検索し、最後にドロップとセミコロンの間を検索して上記のDDLファイルに追加しようとしました。

    sed -n '/CREATE/,/;/p' $SRCFILE > $TGTDDLFILE
    sed -n '/Merge/,/;/p' $SRCFILE > $TGTDMLFILE
    sed -n '/Drop/,/;/p' $SRCFILE >> $TGTDDLFILE

セット1では機能しますが、セット2では機能しません。セット2もカバーするように、すべてのオカレンスに適用するようにスケーリングする方法はありますか。そうでない場合、他の方法はありますか?

あなたの助けに感謝。ありがとう

4

2 に答える 2

0

あなたは次のようなものを使うかもしれません

    sed -n '/CREATE/p' $SRCFILE > $TGTDDLFILE
    sed -n '/Merge/p' $SRCFILE > $TGTDMLFILE
    sed -n '/Drop/p' $SRCFILE >> $TGTDDLFILE

これは、参照しているファイルの1行に1つのSQLステートメントがある場合に、探していることを実行します。1行に複数のSQLステートメントがある場合と複数行に1つのSQLステートメントがある場合の両方で失敗します。

この場合は、を使用することもできますgrep

    cat $SRCFILE | grep 'CREATE' > $TGTDDLFILE
    cat $SRCFILE | grep 'Merge' > $TGTDMLFILE
    cat $SRCFILE | grep 'Drop' >> $TGTDDLFILE
于 2013-03-25T16:23:44.790 に答える
0

元のsedスクリプトの問題の1つは、たとえば、CREATEで始まり、「;」で終わる行の範囲を探すようにsedに指示したことです。--sedは、一致するように要求するときに1行を範囲と見なさないため、「;」は表示されません。CREATEと同じ行にある場合。

このバージョンを試して、うまく機能することを確認してください。

sed -ne 'H;/CREATE/h;/;/{s/.*//;x;/^CREATE/p;}' $SRCFILE > $TGTDDLFILE

最初のコマンド(H)は、必要かどうかに関係なく、現在の行を保留スペースに配置します(これは、CREATEと';'の間の行を処理します)。行にCREATEが含まれている場合は、ホールドスペースを上書きして、行がCREATEで始まるようにします。ここで、行に「;」が含まれている場合 現在の行を消去して、ホールドスペースと交換します。ホールドスペースの内容がCREATEで始まっている場合は、それを印刷します。ここでクリーンアップできる冗長性がありますが、スクリプトにさらに追加するという犠牲を払って、私は気にしませんでした。あなたが巨大なファイルを持っていない限り、それは問題ではありません。

于 2013-03-25T19:21:38.720 に答える