Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

Vimの置換方法まとめ

Vimの標準機能が素晴らしすぎて泣けてくる。編集ファイル内部の置換はまだしもファイル外の置換までできるとは。忘れないようにメモをしておこう。

ファイル内置換

Vimで編集中のファイルにたいしての置換は次の通り。
"ESC"でコマンドモードに切り替えた状態からの説明。

指定ルール
説明 ルール
カーソル行の最初の文字だけ置換 :s/<置換前文字>/<置換後文字>/
カールル行の全ての文字を置換 :s/<置換前文字>/<置換後文字>/g
全ての行の最初の文字だけを置換 :%s/<置換前文字>/<置換後文字>/
全ての行の全ての文字を置換 :%s/<置換前文字>/<置換後文字>/g
置換確認モード :%s/<置換前文字>/<置換後文字>/gc
指定行数内の全ての文字を置換 :<開始行>,<終了行>s/<置換前文字>/<置換後文字>/g
正規表現でマッチした文字を\1で後方参照置換 :s/\(<正規表現>\)/<追加文字>\1/g

※上のスラッシュ(/)をセミコロンで置き換えてもOK。例えばファイルパス置換の時はバックスラッシュでエスケープしないといけないがセミコロン指定では不要になる。

文字列指定

カーソル行の先頭文字からファイル内の全ての文字列を置換する方法。
それぞれの指定でhogeをmogeに置換。

:s/hoge/moge/
:s/hoge/moge/g
:%s/hoge/moge/
:%s/hoge/moge/g
:%s/hoge/moge/gc
:%s;hoge;moge:gc
行番号指定

:set numberなどによって表示されている行数区間を指定してそこに対して置換を行う。
10から15行目のhogeをmogeに全て置換。

:10,15s/hoge/moge/gc
Path文字指定

セミコロンで置換文字を指定するとファイルPathの場合はスラッシュのエスケープが不要になる。
/hoge/mogeというパスを/mogeに全て置換。

:%s;/hoge/noge;/moge;gc
:%s/\/hoge\/noge/\/moge/gc
正規表現指定

正規表現でマッチした内容を後方参照して置換。
hoge(スペース)をmogehogeに置換。\nで後方参照が可能

%s/\(hoge\s\)/moge\1/gc

ファイル外置換

指定した文字を編集中のファイルに限らず、ファイル外の文字も全部指定したい事がある。
perlsedで置換スクリプトを書く事も可能だが、Vimの機能を使うと手間が少なく日本語の置換も簡単。
これは本当に便利。コマンド入力モードでargsとargdoを使う。

指定ルール
説明 コマンド
変換したい外部ファイルを指定 :args **/*
変換したい外部ファイルを確認 :args
全ての文字を変換実行 :argdo %s/<置換前文字列>/<置換後文字列>/g |update

カレントのフォルダ内部の拡張子phpのファイルに対してほげというもじをもげに変換する。最後に正確に置換が行われたかどうかをvimgrepで確認する。

:args **/*.php
:args 
:argdo %s/ほげ/もげ/g | update
:vimgrep /もげ/ **/*.php | cwin