Posted at

vimで検索してから行削除する(globalコマンドを覚える)

More than 5 years have passed since last update.

いつも忘れたころに必要になるのでメモしておく。


通常通り検索をする。

/hoge

hogeがハイライトされる(削除される行をあらかじめ確認)


検索に一致した行を削除する

:g//d

hogeを含む行が削除される


もちろん1行で書けるが

:g/hoge/d

→ いきなり削除されるので確認できない


確認するなら置換コマンドでも良いが

:%s/.*hoge.*\n//c

→ やはり、やや入力が手間


グローバルコマンド

調べたら組み合わせによりもっといろいろできる。


ヤンクする場合

qqq:g//y Q

qレジスタにヤンクした結果が格納される



  • :g//yだけだと最後にヒットした行しか"0に格納されない

  • 末尾Qをつけると大文字レジスタなので"qに追記されていく


  • qqqであらかじめ"qレジスタの内容を消去している(空のマクロを書き込んでいる)


ファイル末尾に移動する場合

:g//m$

→ ヒットした行がファイル末尾に移動する



  • $の部分を0にすると先頭に移動する


  • $の部分を+3とかにすると各行を3行下に移動する


  • mcotにすると移動ではなくコピーになる


ヒットする行の前後を確認する場合

:g//z#.5|echo '----'

→ ヒット行を中心に前後2行ずつ、----区切りで表示される



  • |echo '----'はなくても良いがつけた方が見やすい


結合する場合

:g//,/<C-r>//j 

→ ヒットした2つの行を1行に結合する



  • <C-r>/は最後の検索パターン(この場合はhoge)を挿入している


  • jで与えられた範囲,/<C-r>//、つまり,/hoge/を結合(join)している


  • ,/hoge/は「現在行からhogeを含む直近の行」の範囲を示している

  • ちなみにhogeを含む行が奇数だと怒られる(最後の行が不正な範囲を示すため)


もはやなんでもできる気がしてくる

:g//norm!yyp

→ ヒット行の直後に複製する(ヤンクしてペースト)



  • normでノーマルモードのコマンドを実行できる


  • yyp@qとかにすればマクロも実行できる


参考

Power of g

http://vim.wikia.com/wiki/Power_of_g