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