我有一个脚本可以自动为 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(删除空行),或者您可以执行以下操作以从 DROP 删除到空行:
$ 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
语句后跟一个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
,或者更确切地说,pcre2grep
现在的-M
ultiline 模式:
pcre2grep -vMi '^\h*alter table[^;]*\sdrop\s[^;]*;' file.sql
同时删除前面的注释:
pcre2grep -vMi '(^--.*\n)*^\h*alter table[^;]*\sdrop\s[^;]*;' file.sql