특정 패턴을 가진 파일이 여러 개 있습니다.
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