1

A には、SQL 移行コマンドを含むファイルがあります。例えば

// admin_setting
$this->createTable('{{%admin_setting}}', [
    'setting_id' => Schema::TYPE_INTEGER . "(11)  NOT NULL AUTO_INCREMENT",
    'short_description' => Schema::TYPE_STRING . "(255) NOT NULL",
    'value' => Schema::TYPE_TEXT . " NULL",
    'PRIMARY KEY (setting_id)',
], $this->tableOptions);

// authorization
$this->createTable('{{%authorization}}', [
    'authorization_id' => Schema::TYPE_INTEGER . "(11)  NOT NULL AUTO_INCREMENT",
    'short_description' => Schema::TYPE_STRING . "(255) NULL",
    'PRIMARY KEY (authorization_id)',
], $this->tableOptions);

「createTable()」コマンドを含む行の前に別のコマンドを追加して、サンプル ファイルが次のようになるようにします。

// admin_setting
$this->dropTable('{{%admin_setting}}');
$this->createTable('{{%admin_setting}}', [
    'setting_id' => Schema::TYPE_INTEGER . "(11)  NOT NULL AUTO_INCREMENT",
    'short_description' => Schema::TYPE_STRING . "(255) NOT NULL",
    'value' => Schema::TYPE_TEXT . " NULL",
    'PRIMARY KEY (setting_id)',
], $this->tableOptions);

// authorization
$this->dropTable('{{%authorization}}');
$this->createTable('{{%authorization}}', [
    'authorization_id' => Schema::TYPE_INTEGER . "(11)  NOT NULL AUTO_INCREMENT",
    'short_description' => Schema::TYPE_STRING . "(255) NULL",
    'PRIMARY KEY (authorization_id)',
], $this->tableOptions);

パターンに一致する行を削除する例はたくさんありますが、これまでのところ、上記の変更を得ることができるものはありません。

私が一番近くに来たのは

   awk '/createTable/{print "$this->DropTable();"}1' file

しかし、括弧内の内容を記入することはできません。

4

4 に答える 4

3

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

sed '/createTable/{h;G;s//dropTable/;s/, \[/);/}' file

を含む行をコピーしcreateTable、コピーした行とパターン マッチを追加して、最初に見つかった箇所を置き換えます。

于 2016-02-14T10:15:33.480 に答える
1

でフィールド区切り文字をいじることができますawk。一重引用符に設定すると、フィールド 2 の目的の値にアクセスできます。

awk -F"'" '/createTable/{print "$this->dropTable('\''"$2"'\'');"}1'

sedsも使用できます。

sed 's/\$this->createTable(\('\''[^'\'']*'\''\)/$this->dropTable(\1);\n\0/'

一重引用符をエスケープするのは少し難しいです。別の方法として、コマンドを二重引用符で囲むこともできますが、その場合、シェルが以下を解釈しないように注意する必要があります$

sed "s/\\\$this->createTable(\('[^']*'\)/\$this->dropTable(\1);\n\0/"
于 2016-02-14T10:17:16.717 に答える