여러 파일에서 여러 줄을 제외한 모든 항목 삭제

여러 파일에서 여러 줄을 제외한 모든 항목 삭제

특정 패턴을 가진 파일이 여러 개 있습니다.

ABCD: 
Something 1 
Anything 2

EFGH:
Something 3
Anything 4

ABCD:
Something 5
Anything 6

HIJK:
Something 7
Anything 8

ABCD 뒤의 두 번째 줄을 유지하고 이 모든 파일의 다른 모든 항목을 삭제하고 싶습니다. 단일 파일에서는 다음 명령과 함께 vim을 사용하여 이를 수행할 수 있습니다.

/ABCD\_[^a-zA-Z] (*searches the pattern*)
qaq              (*flush register*)
:g//norm! "A3Y   (*yank 3 lines including pattern into register A*)
ggVG"ap          (*delete everything else*)

그런 다음 몇 가지 간단한 정규식 검색을 수행하여 ABCD 및 Somethings를 제거하고 올바른 Anythings를 남겨둘 수 있습니다.

그러나 권장 사항을 사용 args하고 argdo따르십시오.여기여러 파일의 경우 위의 두 번째 작업에서 "편집기 명령이 아님" 오류가 발생합니다. 두 번째를 건너뛰고 바로 세 번째와 네 번째로 이동해도 같은 일이 발생합니다. 나는 모든 단계에서 공연을 args하고 있습니다.argdo

vim 내부 또는 그 이상을 유지하기 위한 제안이 있습니까?

답변1

모든 것을 하나의 거대한 normal!명령으로 바꿔보세요.

:argdo norm! /ABCD\_[^a-zA-Z]<C-v><CR>qaq:g//norm! "A3Y<C-v><CR>ggVG"ap

<C-v><cr>텍스트를 입력할 수 있는 캐리지 리턴 문자를 사용하십시오 . 이렇게 하면 문제가 해결되지만 접근 방식에는 여전히 부족한 점이 많습니다.

예를 들어:

  • 뭔가를 검색해서 사용할 필요가 없습니다 :g//. 대신에 그냥 사용하세요 :g/ABCD\_[^a-zA-Z].

  • \_A대신 사용할 수 있습니다\_[^a-zA-Z]

  • 전역 명령이 일반 명령을 실행하도록 할 필요는 없습니다. 반대로 ex 명령을 실행하면 레지스터 "a"를 지울 필요가 없습니다. 그러면 그렇게 해 :g/ABCD\_A/3ay.

이것저것 종합해보면 추천드려요

:argdo norm! :g/ABCD\_A/3ya<C-v><CR>ggVG"ap

답변2

다음을 사용하여 답변을 찾고 있기 때문입니다 awk.

awk '/ABCD/ {getline; getline; print}' input

관련 정보