Unixシェルを使用して複数行の文字列を置き換える方法に関するいくつかの質問がありますが、この状況に合った質問は見つかりませんでした。
次のように、いくつかのMySQL DDLからキーと制約を削除しようとしています(例):
CREATE TABLE `access_group` (
`GROUP_ID` int(10) NOT NULL AUTO_INCREMENT,
`PARENT_GROUP_ID` int(10) DEFAULT NULL,
`GROUP_NAME` varchar(45) NOT NULL,
`GROUP_DESC` varchar(45) NOT NULL DEFAULT '',
PRIMARY KEY (`GROUP_ID`),
KEY `testkey` (`PARENT_GROUP_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=latin1;
'PRIMARY KEY'の前にカンマで終わるすべての項目を削除したいのですが、 ') ENGINE ='あります)。結果は次のようになります。
CREATE TABLE `access_group` (
`GROUP_ID` int(10) NOT NULL AUTO_INCREMENT,
`PARENT_GROUP_ID` int(10) DEFAULT NULL,
`GROUP_NAME` varchar(45) NOT NULL,
`GROUP_DESC` varchar(45) NOT NULL DEFAULT ''
) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=latin1;
標準のコマンドラインユーティリティ(sed、perl、awkなど)を使用したいのですが、これらのファイルはかなり大きくなる可能性があるため(一部は数十または数百GB程度)、効率的でなければなりません。ファイルはgzip形式で保存されることが多いので(時にはディスクに先に書くのではなくmysqlダンプユーティリティの出力を直接処理することもある)、入力と出力をパイプできることが必要です。
ベストアンサー1
使用ex
(vim
Exモードとも呼ばれる):
ex +'%s/,\n *PRIM\_.*\ze\n) ENGINE//' +wq file
//
複数行の一致を実行し、\_.*
パターンの最後の部分を除外するVim代替削除(NULL置換)の「一括」バージョン\ze
。
これによりファイルが変更されます。これを望まない場合は、新しいファイルに保存できますfile2
。
ex +'%s/,\n *PRIM\_.*\ze\n) ENGINE//' +'w file2' +q! file
修正する:入力ファイルをパイプするには...これは少し珍しいが追加されましたが、/dev/stdin
トリックを行います。
cat file | ex +'%s/,\n *PRIM\_.*\ze\n) ENGINE//' +'%p|q!' /dev/stdin