0

既存のデータベースのスキーマを Postgresql に変換中です。手動エラーを避けるために、これを可能な限り自動化したいと考えています。

元のデータベースは CLUSTERED インデックスを使用していますが、PG には (実際には) クラスター化されたインデックスはありません。CLUSTERED インデックスのすべての出現箇所を、postgresql に相当するものに置き換える bash スクリプトを作成したいと考えています。

基本的に、次のような行を置換したい:

CREATE clustered INDEX idx_foobar ON foobar (f1, f2, f3, f4,f5);

次のような 2 行の置換を使用します。

CREATE INDEX idx_foobar ON foobar (f1, f2, f3, f4,f5); CLUSTER foobar;

私はマッチングロジックを解決したと思います。私はあまり慣れていないので、正規表現の助けが必要です。動作するように見えるマッチング ロジックは次のとおりです。

  1. CREATE clustered INDEX で始まる行を見つけます (行は 1 つ以上の改行以外の空白で始まる場合があります)
  2. テーブルの名前を保存します ( ONキーワードの後に​​ 1 つ以上の空白が続きます)
  3. 上記の 1 で一致した行からクラスター化された単語を削除して、代替テキストを作成します
  4. 上記のステップ 3 の代替テキストに「\nCLUSTER $tablename」を追加します。
  5. ステップ 1 で一致した行を代替テキスト (ステップ 4 で取得) に置き換えます。

このロジックを bash スクリプトに組み込んで、処理するファイルを渡すことができるように誰か助けてもらえますか?

ちなみに、私はこれを行うために使用できると思ってsedいましたが、sed のワンライナーとしてこれを行うのではなく、bash スクリプトを作成する方が簡単 (つまり、理解しやすい) かどうかはわかりませんが、提案を受け付けています。

4

4 に答える 4

1
sed --posix "/CREATE clustered INDEX/ {
   s/ *clustered */ /
   s/ON *\([^( ]*\) *(.*$/& CLUSTER \1;/
   }"

--posixGNU以外でも利用できるようにするために、スクリプトにコメントを挿入するなど、他の目的で必要に応じて行をさらに変更できる代替手段を用意するために、bob Schuster(非常に優れたもの)以外の正規表現を作成します。

これがcygwin bashのセッションです(バージョンワンライン)

$ cat sample.txt
CREATE clustered INDEX idx_foobar ON foobar (f1, f2, f3, f4,f5);
blabla;

$ sed --posix "/CREATE clustered INDEX/ {s/ *clustered */ /;s/ON *\([^( ]*\) *(.*$/& CLUSTER \1;/;}" sample.txt
CREATE INDEX idx_foobar ON foobar (f1, f2, f3, f4,f5); CLUSTER foobar;
blabla;
于 2013-11-03T08:06:59.243 に答える
0

これはうまくいくかもしれません(GNU sed):

sed -r 's/^(\s*CREATE) (cluster)ed(.* (\S+) \(.*\);)\s*$/\1\3\n\U\2 \L\4;/' file
于 2013-11-03T11:10:14.140 に答える
0

たとえば、次のように sed を試すことができます。

sed -r 's/^\s*(CREATE\s*)clustered\s*(INDEX.*ON\s*)(\w*)(\s+\(.*;)$/\1\2\3\4\nCLUSTER \3;/gi' original.txt > updated.txt

正規表現が少しかさばる理由はあなたのガイドラインに従いましたが、入力ファイルの実際の内容と不要なスペースを保持するかどうかに基づいて正規表現を修正できます。

正規表現を試すのに適した場所の 1 つは、http: //regex101.comです。

于 2013-11-03T04:06:42.080 に答える