LoginSignup
170
147

More than 5 years have passed since last update.

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

Posted at

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

通常通り検索をする。

/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

170
147
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
170
147