

例えば、次のようなファイルがあったとします。

[code]

    0, foo
    0, bar
    0, hoge
    0, fuga
    
[/code]

この最初の数字(この場合なら0)について、代わりに昇順の数字を割りあてたいと思っています。具体的に言うならば、次のようなテキストにしたいと思っています:

[code]

    1, foo
    2, bar
    3, hoge
    4, fuga
    
[/code]

さすがに手作業でちまちま編集するのは、どうも非効率に感じます。もしいい方法がありましたら、教えてください。


CC BY-SA 3.0
2016-05-10T05:16:45.290
24703
2016-05-14T12:53:13.317
939
question
vim
同じ数字を置換するさいに、数字を昇順に割りあてる方法


Vim 7.4.765 以降であれば、対象をビジュアルモードで選択して `g<C-a>` をすると連番が生成されます。


CC BY-SA 3.0
2016-05-10T05:37:37.793
24704
2016-05-10T05:37:37.793
2541
24703
answer


少し煩雑になってしまいましたが、マクロ版です。

[code]

    <CTRL-A>:%s/^0//
    ggqqyw+P<CTRL-A>0q2@q
    
[/code]

  * `<CTRL-A>`
    * 一行目の 0 に Add します
    * 10 飛びにしたい場合は `10<CTRL-A>`
  * `:%s/^0//`
    * それ以外の行頭 0 を消します
  * `ggqqyw+P<CTRL-A>0q`
    * 文の頭に戻り (`gg`) レジスタ q にレコーディングを開始 (`qq`)
    * 単語をヤンクし (`yw`) 次の行の行頭に移動し (`+`) カーソル位置の左にペースト (`P`)
    * カーソル位置の数字 (ペーストされた前行の数字) に Add (`<C-A>`)
    * 行頭に戻る (`0`)
    * レコーディングを終了 (`q`)
  * `2@q`
    * 繰り返す回数を指定し `@q` でレジスタ q 内のマクロを実行します


CC BY-SA 3.0
2016-05-10T06:47:13.710
24708
2016-05-10T06:47:13.710
15437
24703
answer


一応、他の方法も書いておきますね。

数字==行番号で良い場合:

[code]

    :%s/^\d\+/\=line(".")
    
[/code]

  
ビジュアルモードで選択した範囲内の行頭数字を1から振り直す場合:  
(`Shift`+`v`後に複数行選択して`:`を押せば`:'<,'>`が自動で入力されます)

[code]

    :'<,'>s/^\d\+/\=line(".")-line("'<")+1
    
[/code]


CC BY-SA 3.0
2016-05-14T11:42:46.527
24855
2016-05-14T12:53:13.317
2016-05-14T12:53:13.317
2687
2687
24703
answer