← Vim道場

条件に合う行だけ処理する

「TODO と書いてある行だけ全部消したい」「ログ行だけ書き換えたい」。こういう「条件に合う行だけ」の処理をまとめて行うのがグローバルコマンドです。置換が「文字列を探して直す」なら、こちらは「行を探して処理する」道具です。

第6章 まとめて片づけるレッスン 22 / 24

:s との違い

:%s は「文字列を探して置き換える」もので、対象は文字列です。:g は「行を探して、その行に対してコマンドを実行する」もので、対象は行です。

だから :g/debug/d は「debug を含む行を消す」になります。:%s/debug// だと debug という文字だけが消えて、行そのものは空行として残ります。消したいのが行なのか文字なのかで使い分けます。

組み合わせると効く

本物のVimでは、実行するコマンドに normal を指定して普通のキー操作も流せます。:g/TODO/normal A ; のように書くと、TODO を含む行すべての末尾に文字を足せます(この練習ページでは ds だけを扱っています)。

範囲を絞ることもできて、:1,20g/foo/d なら1行目から20行目までが対象です。何も書かなければファイル全体が対象になります。

実行する前に確かめる

対象が広いので、間違えると一気に消えます。不安なときは先に / で同じパターンを検索して、どの行に当たるかを目で確かめてから実行すると安全です。

実行してしまっても u で元に戻せます。グローバルコマンド1回ぶんがまとめて1つの変更として扱われるので、u を1回押せば全部戻ります。

このレッスンで扱うキー

キー動き
:g一致する行だけに実行
:v一致しない行だけに実行
d対象の行を削除
s対象の行を置換

関連記事

レッスン一覧へ戻る