MySQLに対して次の出力を自動的に生成するスクリプトがあります。
ALTER TABLE TESTE3
ADD COLUMN nome2 VARCHAR(2) DEFAULT NULL;
--
-- Create table `TESTE10`
--
CREATE TABLE TESTE10 (
ID INT(11) DEFAULT NULL,
NOME VARCHAR(10) DEFAULT 'J',
nome2 VARCHAR(2) DEFAULT NULL
);
--
-- Drop column `col2` from table `hihi`
--
ALTER TABLE hihi
DROP COLUMN col2;
データベースから何も削除せずに追加するだけです。
以下を削除する必要があります。
ALTER TABLE hihi
DROP COLUMN col2;
sed -i '/drop/Id' file_name_here
その行のみが削除されますDROP COLUMN col2
。ただし、ALTER TABLE hihi
上記の行()も削除する必要があります。
答え1
awk
次のいずれかを使用してくださいtac
。
$ tac file | awk '$1=="DROP"{c=2} !(c&&c--)' | tac
ALTER TABLE TESTE3
ADD COLUMN nome2 VARCHAR(2) DEFAULT NULL;
--
-- Create table `TESTE10`
--
CREATE TABLE TESTE10 (
ID INT(11) DEFAULT NULL,
NOME VARCHAR(10) DEFAULT 'J',
nome2 VARCHAR(2) DEFAULT NULL
);
--
-- Drop column `col2` from table `hihi`
--
バラより印刷には sed- または awk-a-line-follow-a-matching-pattern を使用します。使い方と同様のイディオムのc&&c--
詳細。
または、ブロックの上のコメントを削除するには、c
5(空白行の印刷)または6(空白行の削除)に設定するか、次のようにして空白行に削除できます。
$ tac file | awk '$1=="DROP"{f=1} !f{print} !NF{f=0}' | tac
ALTER TABLE TESTE3
ADD COLUMN nome2 VARCHAR(2) DEFAULT NULL;
--
-- Create table `TESTE10`
--
CREATE TABLE TESTE10 (
ID INT(11) DEFAULT NULL,
NOME VARCHAR(10) DEFAULT 'J',
nome2 VARCHAR(2) DEFAULT NULL
);
答え2
すでに質問した質問を解決するためにこれを拡張できますが、実際の問題を解決するには次のようにすることができますtable_options
。ALTER TABLE
文はMySQLでは完全にオプションです。
ALTER TABLE tbl_name
[alter_option [, alter_option] ...]
[partition_options]
だからスクリプトの形式が正確に次のような場合(ALTER TABLE
ドアの後ろにaがあります)、そのドアをセミコロンに置き換えることがDROP
できます。DROP
sed -i 's/^ *DROP.*/;/' <input.sql
user@server ~/[REDACTED] (git)-[REDACTED] % sed 's/^ *DROP.*/;/' <input.sql
ALTER TABLE TESTE3
ADD COLUMN nome2 VARCHAR(2) DEFAULT NULL;
--
-- Create table `TESTE10`
--
CREATE TABLE TESTE10 (
ID INT(11) DEFAULT NULL,
NOME VARCHAR(10) DEFAULT 'J',
nome2 VARCHAR(2) DEFAULT NULL
);
--
-- Drop column `col2` from table `hihi`
--
ALTER TABLE hihi
;
ただし、スクリプトが常に正しい形式に従うことを確認するのはあなたの責任です。それ以外の場合は、コメントで述べたようにステートメントを生成するスクリプトを編集するか、出力で構文アナライザを実行する必要があります(どちらもこれよりも優れたソリューションです)。
答え3
pcregrep
これでultilineモードが利用可能にpcre2grep
なります-M
。
pcre2grep -vMi '^\h*alter table[^;]*\sdrop\s[^;]*;' file.sql
以前のコメントも削除してください。
pcre2grep -vMi '(^--.*\n)*^\h*alter table[^;]*\sdrop\s[^;]*;' file.sql