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_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

관련 정보