テキストエディタにはよっぽど原始的なものでない限り置換機能がついている。当然、Linuxのvi(vim)でも文字列の置換はできる。
このページではviでの文字列置換についてお伝えした。参考にしていただければと思う。
目次
viでの基礎的な置換
テキストの置換
メモ帳を始めとしたテキストエディタには基礎機能として「指定の文字列を指定の文字列へ置き換える機能」がそなわっている。この「指定の文字列を指定の文字列へ置き換える機能」を一般的に「置換」とよばれる。ご存知の方がほとんどだろうし、使ったこともあるだろう。
vimもテキストエディタであり置換機能が用意されている。vimは高機能なエディタであり、メモ帳などよりも高度な置換を行うことが可能となっている。「置換」は一般的にはファイル全体や一部を指定して文字列を一斉に置き換える時に使用される。
プログラムの変数などの名前を一斉に変更したい場合などに重宝する機能だ。
viでの置換方法
置換作業はコマンドモードで行う。ノーマルモードの状態で「:」を押してみよう、一番下の行が変化しコマンドモードに移行する。コマンドモードの状態で「%s/置換対象文字列/置換後文字列/g」とするとファイル内の文字を置き換えてくれる。
例えば以下のような内容のファイルがあるとする。
置換の書式としては
:s/置換対象文字列/置換後文字列/
が最も基礎的な置換となる。カーソル行で最初に合致した文字列を置き換える。
今回の例では
:s/aaa/eee/
と指定してみた。最初にある「aaa」が「eee」に置き換わる。
行全体の置換
:s/置換対象文字列/置換後文字列/g
gを指定すると現在のカレント行にある全ての置換対象文字列を置換後文字列に置き換えてくれる。
この例では
:s/aaa/eee/g
になっている。
ファイル全体の置換
しかし多くの場合ファイル全体を指定して置換したいというのが一般的だろう。「:」のあとに「%」を指定するとファイル全体を指定することになる。
:%s/置換対象文字列/置換後文字列/g
:%s/ccc/eee/g
「aaa」にカーソルを置いた状態から「ccc」を「eee」に置換した。
区切り文字を変える
区切りに「/」以外を使用することも可能となっている。パスを指定するときに便利だ
以下の内容のファイルが存在しているとして
:%s;/usr/bin;/bin;g
「;」を仕切りにして使用する。
この場合エスケープ文字でエスケープするという手段もある。
:%s/\/usr\/bin/\/bin/g
とすると同じ効能が得られる。
置換前の確認
置換前に確認をとりたい場合は「c」を追加する。
:%s/置換対象文字列/置換後文字列/gc
行範囲での指定
行範囲を指定する場合「%」の代わりに行番号を指定する。
:1,10 s/置換対象文字列/置換後文字列/g
複雑な置換
vimのデフォルトの正規表現は「なまり」があるので、それを緩和するために「\v」を追加して置換動作をする。
:%s/\v置換対象文字列/置換後文字列/g
とすると多少正規表現のなまりが解消される。
ワイルドカードを使用したような置換
fstabを開いてみた。通常あり得ないが、例として「defaults」になるべき部分が「default」となっている。正しい表記に正規表現を交えて置換してみよう。
:%s/\vdef\w*lt/defaults/g
置換を実行してみよう。
主な正規表現
正規表現を利用すると、曖昧な文字列を明確にマッチングできる「ワイルドカードを使用したような置換」で使用した記号的な文字列も正規表現のものだ。
- . なにかしらの一文字にマッチ
- ^ 行頭にマッチ
- $ 行末にマッチ
- \w なにかしらの文字にマッチ
- \n 改行にマッチ
- \t タブにマッチ
- \s 空白にマッチ
- [0-9] 0から9の一文字にマッチ
- [a-z] aからzの一文字にマッチ
- [abc] abcのどれかの一文字にマッチ
- * 正規表現、直前文字の0回以上の繰り返しにマッチ。
マッチ条件が正しいか確かめたい
最初は正規表現に慣れないため不安になる方もいらっしゃるかもしれないが、単純に正規表現が正しく文字にマッチするかを確かめたいときは、ノーマルモードの状態で「/」を押して「文字列検索」してみるとよい、同じ正規表現が使用可能となっているので確認することができる。
詳しくは下記ページが参考になるだろう。
まとめ
このページではviでのテキスト置換の方法についてまとめてお伝えした。はじめのうちは混乱すると思うが、すぐに慣れるはずだ。
vimのデフォルトの正規表現は訛があるので、それを緩和するために「\v」を追加して置換動作をする。
:%s/\v置換対象文字列/置換後文字列/g
とすると多少正規表現のなまりが解消される。
漢字と平仮名が混在している(他のセクションでは平仮名)
ご指摘いただきありがとうございます。
表記ゆれがありましたので訂正いたしました。
引き続き、ご愛読のほど、よろしくお願いいたします。