리눅스 vi에서 특정 패턴이 들어간 연속된 라인 제거하는 방법 문의

stock9343의 이미지

안녕하세요.
리눅스의 특정 파일의 내용중에서
.SUBCKT AAA_IP
MMNP VSS VDD
MMNP1 VSS VDD
MMNN VDD VSS
MMNN1 VDD VSS
.ENDS
라는 내용이 포함되어 있을 때
.SUBCKT AAA_IP가 들어간 패턴
(시작점)에서
.ENDS(끝점)까지의 모든 내용을
제거하고 싶을 때
vi 명령을 어떻게 구성해야 되는지 문의드립니다

구글에서 vi범위 설정 시,
전부 1,0 .,$, %와 같은
사용자가 지정해야 되는 범위에 대한
설정밖에 없는데, 특정 패턴을 검색에서
범위를 시작에서 끝까지 잡고
지우거나 치환하는 방법 공유부탁드립니다

chanik의 이미지

vim에서 줄번호 말고 정규식으로 범위를 지정할 수도 있네요.
이런 거 안 되는 줄 알았는데 해 보니 되는군요.

:/\.SUBCKT AAA_IP/,/\.ENDS/d

그런데, 저런 범위가 복수개 있을 경우 현 커서 위치 이후 처음 등장하는 범위 하나만 삭제됩니다. 해결방법이 있는지 모르겠는데, 그냥 vim 대신 sed 쓰면 복수개의 범위 모두 삭제됩니다.

$ sed -e '/\.SUBCKT AAA_IP/,/\.ENDS/d' infile > outfile

원본파일을 바로 수정하려면 아래와 같이 합니다.

$ sed -i -e '/\.SUBCKT AAA_IP/,/\.ENDS/d' infile

stock9343의 이미지

감사합니다 ㅎㅎ
구글에 아무리 찾아봐도 없길래, 문의드렸는데..
출근해서 업무에 적용해봐야 겠네요 ㅎ
감사합니다 ~~~

ymir의 이미지

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

chanik의 이미지

올려주신 링크 내용을 보니
vim에서도 g 명령을 쓰면 범위 여러 개가 일괄처리되는군요.
아래 두 방식 다 동작하네요. 덕분에 모르던 것을 배우고 갑니다.

:g/\.SUBCKT AAA_IP/,/\.ENDS/d

:g/\.SUBCKT AAA_IP/ .,/\.ENDS/d
jick의 이미지

스크립트를 쓰거나 여러 번 해야 하면 위의 방법이 편리한데, 눈으로 보면서 수동으로 고칠 때엔 이런 방법도 있습니다.

/AAA_IP (Enter) -> 커서는 AAA_IP 위에 위치
V -> line selection 시작
/\.ENDS (Enter) -> AAA_IP에서부터 .ENDS가 있는 라인까지 선택
d -> 선택된 범위 삭제