Linux下如何删除一行及上面一行?

Linux下如何删除一行及上面一行?

我有一个脚本可以自动为 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

使用任何awktac

$ 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_optionsALTER 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现在的-Multiline 模式:

pcre2grep -vMi '^\h*alter table[^;]*\sdrop\s[^;]*;' file.sql

同时删除前面的注释:

pcre2grep -vMi '(^--.*\n)*^\h*alter table[^;]*\sdrop\s[^;]*;' file.sql

相关内容