2016-08-29 4 views
5

다음과 같은 텍스트가 있습니다.vim에서 n 번째 패턴의 n 번째 패턴을 표시 할 수 있습니까?

남자가 걷고 있고 남자가 먹고있다.

어떻게하면 다음과 같이 변환 할 수 있습니까?

남자 1이 걷고 남자 2가 먹고있다.

이 나는 ​​단어 man의 발생 수를 계산하는 :%s/\<man\>//gn을 사용할 수 있습니다 알고 나는 /\%(\(pattern\).\{-}\)\{n - 1}\zs\1 패턴의 n 번째 발생을 찾을 수 있습니다 알고 있습니다. 그러나 n 번째 발생을 어떻게 표시합니까?

모든 도움을 진심으로 감사드립니다. 미리 감사드립니다.

답변

6

발생 횟수를 계산하는 비 순수 함수가 있어야하며 그 함수의 결과를 사용해야합니다.

" untested 
let s:count = 0 
function! Count() 
    let s:count += 1 
    return s:count 
endfunction 

:%s/man\zs/\=' '.Count()/ 
+1

그냥 약간의 추가. 이것을 vim 스크립트에 추가하지 않으려면 전역 변수, 즉'let g : count = 0' 또는 적어도 vars :'let b : count = 0'을 사용하고 싶을 것입니다. ': help internal-variables'에서 읽을 수있는 변수 네임 스페이스에 대해서 –

+0

Maya 이것은': % s/man \ zs \ ze/\ = ''.Count() /'로 수정되어야합니다. 고마워, 이건 내게 큰 도움이된다! – awllower

+1

@awllower. 나는'\ zs'를 실제로 사용하고 싶었지만, 러시에서는 다른 것을 사용했습니다. 감사! –

2

매크로를 사용하여이를 수행 할 수 있습니다. 먼저 /man /e과 같은 패턴을 검색하십시오.

:let cnt=1과 같이 개수에 대한 변수를 만들어 보겠습니다.

이제 a 등록을 지우겠습니다.

qa을 눌러 녹음을 시작하십시오.

프레스 n.

i을 누른 다음 Ctrl + R을 입력하십시오. 유형 : cnt. 카운트 값이 거기에 삽입됩니다. 그런 다음 :let cnt=cnt+1을 입력하십시오.

이스케이프를 누릅니다.

q을 눌러 등록을 중지하십시오.

이제 :%s/man //gn을 입력하여 발생 횟수를 가져옵니다.

이제는 발생 횟수를 알고 있습니다 (예 : 10). [email protected]을 누릅니다. 모든 어커런스에 숫자가 추가되며 모든 숫자가 증가 할 때마다 증가합니다.

+1

놀랍도록 간단한 매크로 접근에 감사드립니다. – awllower