라인의 마지막 매치에서만 작동 할 수 있습니까?


16

:s/pattern/replacement첫 경기 :s/pattern/replacement/g에서 모두 작동 합니다.

마지막 것에서 만 작동하는 방법?

답변:


18

나는 사용할 것이다 \zs

:%s/.*\zspattern/replacement/

약간의 설명 :

  • . 단일 문자를 나타냅니다
  • * 욕심 매칭 (최대한)

빔에서는 제로 폭 앵커를 사용 \zs하고 \ze시작과 일치하고자하는 검색 패턴의 끝을 정의합니다. 전 아무것도 \zs후의 \ze당신의 패턴의 교체에 의해 영향을받지 않습니다.

이해하기 쉽도록 wikiaSearch and replace 에서이 예제를 사용하고 싶습니다 .

\zs\ze을 사용하여 입력을 저장하여 패턴의 시작과 끝을 설정하십시오. 예를 들어,

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ 

사용하다:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

자세한 내용은


\zs답변에서 무엇을하는지에 대한 기본 설명을 제공해 주 시겠습니까?
EvergreenTree

3
이것이 작동 하는 이유.*탐욕 스럽기 때문에 주목할 가치가 있습니다.
와일드 카드

7

당신은 모든 그룹화하여 마지막 경기를 검색 할 수 \(.*\)의, 그러나 마지막 ocurrence을 pattern. 그런 다음 캡처 된 그룹을 종료하고을 \1추가하십시오 replacement.

:%s/\(.*\)pattern/\1replacement/

(이것은 @ryuichiro의 \zs솔루션 보다 열등 합니다. 귀하의 \1접근 방식은 기능적으로 동일하지만 더 장황합니다. (다른 한편으로는 다른 정규식 풍미에 사용되는 경우 특히 기억하기가 더 쉬울 수 있습니다.))
Aaron 토마

0

완전성을 위해 대안을 게시 할 것이라고 생각했습니다. Vim에는 다중 항목 이 있으며 그 중 일부는 더 일반적인 정규 표현식 둘러보기 어설 션 (음수 / 양수 미리보기 / lookbehind) 과 유사합니다 . /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

이 경우 네거티브 lookahead를 원합니다. \@!즉 , 항목 앞에있는 원자가 pattern 이후에 발생하지 않도록해야합니다 . 이 경우 원자는 패턴 그 자체 앞에 다른 것입니다.

:%s/pattern\(.*pattern\)\@!/replacement/

괄호 안의 부분은 너비0 이며 일치 항목에 포함되지 않으므로 대체로 대체되지 않습니다.

:h \@!자세한 내용이나 :h pattern-multi-items다른 둘러보기 변형이 포함 된 전체 섹션 을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.