sed: 일치하는 패턴 사이의 모든 줄을 반환하고 종료합니다.

sed: 일치하는 패턴 사이의 모든 줄을 반환하고 종료합니다.

mysql 백업 파일에서 특정 테이블을 복원할 라인만 추출하고 싶습니다. 다음은 작동합니다.

zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/p' > account_codes.sql

그런데 백업 파일의 크기가 9GB라서 엔딩 일치 항목이 발견되면 검색을 중단하고 싶습니다. 따라서 위 명령의 sed 부분에서 다음과 같이 끝에 p 대신 {p;q}를 추가할 수 있습니다.

zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;q}' > account_codes.sql

그것은 중지되지만 "from" 일치 이후에는 "to" 일치가 아닙니다. 기본적으로 출력은 전체 블록의 첫 번째 줄뿐입니다.

DROP TABLE IF EXISTS `account_codes`;

q명령이 패턴 일치 끝에서만 적용되도록 이 문제를 어떻게 수정할 수 있습니까 ?

답변1

나는 찾았다이 게시물, 나는 sed 명령을 다음과 같이 수정하는 데 사용했습니다.

zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;/UNLOCK TABLES/q}' > account_codes.sql

본질적으로 이는 sed에게 일치하는 줄을 찾은 다음 파일에서 다음 "UNLOCK TABLES" 문자열을 찾으면 종료하도록 지시합니다.

mysql 백업 파일에서 "UNLOCK TABLES;" 다음에 (예를 들어)

--
-- Table structure for table `account_table`
--

그러나 sed 명령을 다음과 같이 수정하면

zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;/-- Table structure for table/q}' > account_codes.sql

sed는 해당 문자열을 찾아도 멈추지 않습니다. 나는 왜 그렇지 않은지 알아낼 만큼 sed에 대한 경험이 충분하지 않습니다. 누군가 이것을 명확히 하기 위해 댓글을 남길 수 있을까요?

관련 정보