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

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--詳細。

または、ブロックの上のコメントを削除するには、c5(空白行の印刷)または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_optionsALTER 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

関連情報