← Vim道場

まとめて置換する

同じ語をファイル全体で置き換えるなら、1つずつ直すより置換コマンドが確実です。書き方は :s/置換前/置換後/ の1本で、どこを対象にするかを頭に、どこまで置き換えるかを末尾に足して調整します。

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

4つの部品でできている

置換コマンドは :[範囲]s/[置換前]/[置換後]/[フラグ] の形です。範囲を省くと現在行、% ならファイル全体、1,10 のように行番号を書けばその範囲になります。

フラグの g は「その行のすべて」、i は大文字小文字を区別しない、c は1つずつ確認しながら置き換える、という意味です。c を付けると置き換えるたびに確認を求められるので、範囲が広いときの保険になります(この練習ページでは c は扱っていません)。

置換前は正規表現

置換前に書くものは単なる文字列ではなく正規表現です。.* はそのままだと特別な意味を持つので、文字そのものとして探したいときは \. のように打ち消します。

逆に、これを使うと :%s/\<old\>/new/g のように「単語としての old だけ」を狙えます。単純な文字列置換では oldName の一部まで巻き込んでしまうので、この書き方を知っておくと事故が減ります。

置換とドットコマンドの使い分け

すべてを機械的に置き換えてよいなら置換が確実です。置き換えたい箇所とそのままにしたい箇所が混ざっているときは、検索して . で1つずつ直すほうが安全です。

置換した結果が思っていたのと違ったら u で戻せます。範囲の広い置換ほど、実行前に / で検索して当たり具合を見ておくと安心です。

置換後の文字列で使える記号

置換後の側でも特別な意味を持つ記号があります。& はマッチした文字列全体を指すので、:%s/error/[&]/g と書けば error[error] で囲めます。

パターン側で \( \) でくくった部分は \1 \2 で呼び出せます。:%s/\(\w\+\)_\(\w\+\)/\2_\1/ のように、前後を入れ替える置換が書けます。\U \L を付けると、それ以降を大文字や小文字にできます。

区切りは / でなくてよい

パスを扱うときに / を区切りにすると、パターンの中の / をすべて打ち消すことになって読めなくなります。区切り文字は自由に選べるので、:%s#/usr/local#/opt#g のように # を使えば打ち消しが不要になります。

使えるのは英数字とバックスラッシュ以外の記号です。#, がよく使われます。置換前に何が入るかを見て、その中に出てこない記号を選ぶのが要点です。

同じ置換をもう一度

直前の置換を今いる行にもう一度かけたいときは & を押します。フラグも含めて繰り返したいときは :&&、ファイル全体にかけ直すなら :%&& です。

. は置換コマンドを繰り返せないので、この & が置換におけるドットコマンドにあたります。範囲を絞って何度か試しながら詰めていくときに使います。

このレッスンで扱うキー

キー動き
:s現在行を置換
gその行のすべてを対象に
%ファイル全体を対象に

関連記事

レッスン一覧へ戻るキーの逆引き一覧検定を受ける