vimの範囲置換
ある程度コードを書いてから、自分の設計ミスに気づいて今書いたところを直して…と思ったらその修正もおじゃんなので再び書きなおして…という三歩進んで二歩下がる水前寺清子式開発を実践している僕です。
vimを1年以上使っていながら今日初めて選択範囲置換の方法を知りました。行単位かファイル単位での置換しかしらなかったので、すごく便利です。これで僕の三百六十五歩のデスマーチも捗りそうです。
というわけでvimでの置換についておさらいしたので覚書。
文字単位で置換
r
カーソルを置換したい文字に合わせて r を入力し、その後に置換したい文字を入力すると、カーソルの文字が置換される。
行単位で置換
:s/{置換前文字}/{置換後文字}/[オプション]
これでカーソル行内にある文字を置換できる。
置換時のオプションには次の文字が使える
- g 行の中でマッチしたすべての文字を置換する
- c マッチするたびに置換するかどうか聞く
- i 大文字小文字のを無視する
- I 大文字小文字を判別する
- n 該当する箇所が何箇所あったか教えてくれる、教えてくれるだけで置換は行わない
また以下のようにスラッシュをセミコロンで代用できる。
:s;{置換前文字};{置換後文字};[オプション]
例えば/var/www/のようなスラッシュの入った語を置換したい時なんかに使用する。
範囲を指定して置換する
:'<,’>s/{置換前文字}/{置換後文字}/[オプション]
ヴィジュアルモードで行など選択中にコロンを押すと「:'<,’>」がコマンドラインに挿入される。なのでそこに行単位置換のコマンドを追加すればいい。
また、以下のようにしてある行からある行までを指定してそのなかで置換させることもできる。
:開始行,終了行s/{置換前テキスト}/{置換後テキスト}/[オプション]
どちらもオプションを使うことができる。
ファイル単位での置換
:%s/{置換前文字}/{置換後文字}/[オプション]
%を挿入することで、ファイル全体を対象とした置換ができる。
参考:http://d.hatena.ne.jp/omiyan/20110125/p1
↑
Viで置換処理を行うコマンドについて
viを使っていると置換コマンドを使う場合があります。
基本的な使い方は以下のような場合です。
例えばよく使うパターンとして、ファイル内の「置換前テキスト」を「置換後テキスト」に変換する場合のコマンドは次のようになります。(ファイル全文で、確認が毎回入ります。)
:%s/{置換前テキスト}/{置換後テキスト}/gc
オプション説明
:sでコマンドラインモードの「substitude」に移ります。
substitudeとは代入とかいう意味です。(後述参考)
%を付ける場合は、開いているファイルの内容すべてを対象とします。
gはマッチしたテキストすべてを置換します。
cは置換前に、実行してよいか毎回確認するオプションです。
例1:カーソルのある行の最初の一番目に見つかった文字列を置き換える場合
:s/{置換前テキスト}/{置換後テキスト}
例2:カーソルのある行で見つかったすべての文字列を置き換える場合
:s/{置換前テキスト}/{置換後テキスト}/g
例3:スラッシュ(/)が含まれる文字列を置き換える場合
セミコロン(;)で代用しましょう。
:%s;{置換前テキスト};{置換後テキスト};g
- ケース:ファイル内の文字列{/home/hogehoge/}を{/var/www/}に置き換える場合
:%s;/home/hogehoge/;/var/www/;g
例4:ファイルの行数を指定して文字列を置き換える場合
:開始行,終了行s/{置換前テキスト};{置換後テキスト};g
- ケース:20行目から80行目までの文字列を置き換える場合
:20,80s/{置換前テキスト}/{置換後テキスト}/g
- ケース:20行目から最終行(ファイルの最後)までの文字列を置き換える場合
:20,$s/{置換前テキスト}/{置換後テキスト}/g
ポイント:sをつけ忘れないように
置換モードはコマンドモードでsをつけ忘れないようにしましょう。
sとはどういう意味かというと、代入という意味です。
即ちvimの内部処理は、文字列を検索して、代入する(上書き)するという意味です。
人間が使う置き換えという言葉に、vimの「検索」「代入」という2アクションが含まれています。