Vim

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

More than 3 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