2016-08-29 6 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のように、countの変数を作成しましょう。

今、a登録をクリアしましょう。

qaを押して録画を開始します。

プレスn

iを入力し、次にCtrl + Rタイプ=を入力します。タイプcnt。 countの値がそこに挿入されます。 次に、:let cnt=cnt+1と入力します。

Escapeを押します。

qを押して登録を停止します。

今度は、:%s/man //gnと入力して出現回数を取得してください。

ここで、発生数を知っています(たとえば、10)。次に、[email protected]を押します。 すべてのオカレンスには、オカレンスごとにインクリメントされる番号が付加されます。

+1

この驚くほど簡単なマクロアプローチに感謝します。 – awllower

関連する問題