vim 전역 명령은 처음에만 나타납니다.

vim 전역 명령은 처음에만 나타납니다.

vim에서 :g 명령을 사용하여 검색 결과의 첫 번째 항목만 일치시킬 수 있는지 궁금합니다.

다음 내용이 포함된 파일이 있습니다.

Match 01
    stuff 01
    stuff 02
    stuff 03
Match 01
    stuff 01
    stuff 02
    stuff 03
Match 02
    stuff 01
    stuff 02
    stuff 03
Match 02
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03

데이터를 추출하기 위해 다음 명령을 실행하려고 합니다.

:g/Match 02/.,$w! /tmp/TESTING.txt

그래서 전역 명령을 사용한 다음 현재 줄부터 문서 끝까지 /tmp/TESTING.txt에 씁니다.

하지만 현재 줄은 항상 일치 항목의 마지막 항목이므로 결국

Match 02
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03

바꾸다

Match 02
    stuff 01
    stuff 02
    stuff 03
Match 02
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03

이것이 내가 원하는거야. 전역 명령이 일치하는 첫 번째 항목에만 이동하도록 하여 이 문제를 해결할 수 있는지 궁금합니다.

답변1

문제는 커서가 첫 번째 일치 항목 아래에 있다는 것 같습니다. 제 제안은 vim에게 커서를 1행으로 이동한 다음 범위/쓰기를 수행하도록 지시하는 것입니다.

:1 | /Match 02/,$w! /tmp/TESTING.txt

파일에 범위를 쓰고 싶은 것 같고 범위는 다음과 같이 정의되어 있기 때문에 마침표를 제거했습니다.~에서$파일 끝까지 "Match 02"를 검색하세요 .

인용하다:

답변2

이것은 나에게 효과적인 것 같습니다. 주문에 문제가 있는 것 같습니다. 전역 매칭입니다.예전에는다음 일치 항목과 일치합니다(전역이므로).

0;/Match 02/;,$w! file

답변3

Global은 각 일치 항목에 대해 명령을 실행하므로 실제로 파일에 기록되는 내용은 .,$첫 번째 일치 항목, 그 다음 .,$두 번째 일치 항목 등입니다. 이는 각 일치 항목의 내용을 삭제하는 대신 출력 파일에 추가하여 관찰할 수 있습니다.

:g/Match 02/.,$w >> TESTING

매크로가 더 적합할 수 있습니다.

qa1G/Match 02
:.,$w! TESTING
q

위의 개행 문자는 리턴 키를 혼합해야 하는 곳입니다. 그런 다음 을 입력하면 :reg a다음과 같이 표시됩니다.

:reg a
--- Registers ---
"a   1G/Match 02^M:.,$w! TESTING^M

입력하여 재생할 수 있습니다@a

관련 정보