SQLスキーマ定義ファイルのgit diffからの出力が与えられると、更新スクリプトと元に戻すスクリプトを作成できる単純なbashscriptを作成しようとしています。したがって、次のような入力があります。
create table xxx
(
- aaa numeric(18) primary key,
- bbb numeric(18) not null,
- ccc numeric(18) not null,
+ aaa INT UNSIGNED AUTO_INCREMENT primary key,
+ AlarmId INT UNSIGNED not null,
+ ccc INT UNSIGNED not null,
ddd smallint not null,
eee varchar(2),
fff varchar(2),
)
更新スクリプトを作成したいとしましょう。すべてのcreate
ステートメントをalter
's に変更し、不要な行をすべて取り除き、最後に '+' マークをchange
ステートメント (mysql スクリプト) に置き換えます。私はそうするのが好きです:
sed "s/^\s*create/ALTER/g" < $infile | sed "/^\s\|@/d" | sed "/^-/d" | sed "s/^+\s*\(\`\?\w\+\`\?\)/\tCHANGE \1 \1/g"
だから私は最終的にこのようなものを得る:
ALTER table xxx
CHANGE aaa aaa INT UNSIGNED AUTO_INCREMENT primary key,
CHANGE bbb bbb INT UNSIGNED not null,
CHANGE ccc ccc INT UNSIGNED not null,
CHANGE ddd ddd smallint not null,
ALTER table yyy
CHANGE aaa aaa INT UNSIGNED primary key,
CHANGE bbb bbb smallint not null,
CHANGE ccc ccc smallint not null,
CHANGE ddd ddd INT UNSIGNED not null,
CHANGE eee eee varchar(1024) not null
ALTER table zzz
(and so on)
最後に行う必要があるのは、各ステートメントをコロンで完了することです。基本的に、各ALTER
ステートメント (または EOF) を検索し、その上の行の末尾にコロンを追加する必要があります (既存のコンマを置き換える可能性があります)。s
コマンドを使用してvimで実行できました:
%s/\(,\)\=\_s\+\(ALTER.*\|\%$\)/;\r\2
しかし、これを sed 構文に変換できませんでした。sed に複数行のパターンを受け入れるように強制するのは難しい仕事のようです。だから - 誰でもこれを行う方法を教えてもらえますか? sed だけが選択肢ではないと思います。それは私の最初の選択でした(見た目ほど最高ではありません:))おそらく、すぐに使えるソリューションがいくつかあり、車輪を再発明しているだけですか?