Vimでサクッと置換する方法と置換コマンドの構成
投稿日:2022年4月17日 更新日:
Vimにも、他のテキストエディターと同様に置換機能があります。
置換する方法は主に2つあり、
- ノーマルモードのコマンドを使用したカーソル付近での置換
- コマンドモードのコマンドによるファイルの指定領域での置換
があります。個人的には、
カーソル付近のテキストをサクッと置換したいときには "1. ノーマルモードのコマンド" を、
ファイル全体を置換したい場合には "2. コマンドモードによる置換"
をよく使っています。
カーソル付近の置換(文字変更)
1文字ずつの変更
操作 | コマンド |
---|---|
1文字のみ変更 | r |
<Esc>を押すまで1文字ずつ変更 | R |
カーソルに重なっている文字を置換(変更)します。
1文字変更してすぐノーマルモードに戻る場合はr
コマンドを使い、
<Esc>キーを押すまで文字を変更し続ける場合はR
コマンドを使います。
モーションを使った変更
操作 | コマンド |
---|---|
1行置換 | cc |
カーソルから行末まで置換 | C |
1単語置換 | ciw |
モーションによって置換する範囲指定をしたい場合は、置換するオペレーターc
を使ったコマンドが使えます。
c
を使ったコマンドを使うと、モーションに対応した範囲のテキストを削除して挿入モードに入るので、ノーマルモードに戻るには <Esc>キーが必要になります。
モーションは、カーソル移動のコマンドかブロックを指定する文字が入ります。
詳しくは下記をどうぞ。
>> Vimのコマンドの表記とコマンドの基本構造(オペレーターとモーション)
応用: 検索にヒットしたテキストを順に置換(サクっと置換)
操作 | コマンド |
---|---|
検索にヒットした文字を順に変更 | /{置換前テキスト}<Enter> → ciw → {置換後テキスト}<Esc> → n. → n. → ··· |
カーソル上の文字と同じ文字を順に変更 | *N → ciw → {置換後テキスト}<Esc> → n. → n. → ··· |
上記で取り上げたr
, c
コマンドと検索 /
{キーワード} コマンド、 繰り返し .
コマンドを組み合わせることで、
上部(または下部)から順にファイル全体の置換を行っていくことが可能です。
組み合わせに使用しているコマンドは下記になります。
/
{キーワード}<Enter>: 検索*
: カーソル上の単語を検索n
: 検索にマッチする、次のテキスト位置に移動N
: 検索にマッチする、前のテキスト位置に移動.
: 前回に使用したコマンドを繰り返す
検索コマンドでは、正規表現を使った柔軟な検索も可能です。
正規表現で使える文字の一例を後に示しておきます。
ファイル全体・指定範囲を置換
コマンドモードを使った置換方法もあります。
ファイル全体の置換や指定した行内での置換などが行えます。
ファイル内に存在するすべてのBBBをCCCに置換するコマンドは下記になります。
:%s/
BBB/
CCC/g
<Enter>
置換コマンドの構造
コマンドモードでの置換コマンドの構成は、Fig.5のようになっています。
コマンド内の"s"は"Substitute"の略です。
置換範囲とgフラグがない場合、カーソルから最初にマッチしたテキストのみが置換されます。
1.置換範囲
置換する行を指定します。
ビジュアルモードで先に置換範囲を選択しておけば、: を入力した後に自動的に記号が入ります。
- %: すべて行
- 1,20: 1~20行
- ,$: カーソル以下の行
- ‘<,’>: ビジュアルモードで選択した行(ビジュアルモードで選択していると自動で入力される)
2.置換前後のテキスト
{置換前テキスト} にマッチしたパターンを {置換後テキスト} に置き換えます。
正規表現を使った柔軟な文字指定をすることも可能です。
たとえば、「任意の1文字」を意味する . を使って、
{置換前テキスト} として"data."を入力すると、下記のような文字列がマッチして置換されます。
- data1, data2, data3, …., dataa, datab, …, dataA, dataB, ……
正規表現で使える文字については後でも取り上げます。
またマッチした {置換前テキスト} の一部を、そのまま置換後テキストに流用すること、
つまり置換するテキストの中の一部分を保持したまま置換もできます。
{置換前テキスト} 内の保持したい文字を \( \) で囲うと、{置換後テキスト} 内の \1 の部分に流用されます。
たとえば、
:%s/\(A.\)Bb/\1Cc/g
のコマンドを実行すると、下記のような置換が一度に実行されます。
- AaBb → AaCc
- AbBb → AbCc
- AcBb → AcCc
- AABb → AACc
- ABBb → ABCc
"A."が置換後に流用されていることがわかります。
\( \) を複数用いたときには、その順番に \1, \2, \3, … へと割り振られて行きます。
3.フラグ
置換コマンドに付与するフラグによって、置換する動作が変化します。
比較的使用するフラグは下記になります。
同時に複数のフラグを付与することも可能で、
:%s/BBB/CCC/gc
のように指定します。
- g : 各行の中でマッチしたすべての単語を置換する(これがない場合、置換されるのは各行で最初にマッチしたテキストのみ)
- c : 各置換場所で毎回確認を行う
- i : 置換前の文字(アルファベット)の大・小文字を区別しない
- I : 置換前の文字(アルファベット)の大・小文字を区別する
4.デリミター(区切り文字)
置換コマンドのデリミター(区切り文字)にはスラッシュ / を用いることが多いですが、
その他の記号であっても==\== ‘ | 以外の1バイト文字であれば、使用可能です。
例:; : ! # 等
置換前・置換後テキストにスラッシュ記号を含ませたい場合、
その前にバックスラッシュ \ (または円マーク ¥ )を置いてエスケープ(記号が持つ意味を消す)必要がありますが、デリミターに他の記号を使うことでスラッシュ記号のエスケープが不要になります。
置換文字の表現方法(正規表現)
正規表現で使用できる文字の一部を下に示します。
Vimでの正規表現は、他の言語での正規表現と異なり、記号の前にエスケープが必要であったりそうでなかったりすることがあるので注意が必要です。
- . : 任意の1文字を表す
- \n : 改行を表す
- \t : インデント(TAB)を表す
- \s : 空白文字を表す
- /< : 単語の始まりを表す
- /> : 単語の終わりを表す
- ^ : 行の始まりを表す
- $ : 行の始まりを表す
まとめ
Vimの置換方法
- ノーマルモード
- 1文字ずつ置換:
r
,R
- 消去範囲を指定して置換:
cc
,C
,ciw
等 - 検索しながら置換を繰り返し: /{置換前テキスト}<Enter> →
ciw
→ {置換後テキスト}<Esc> →n.
→n.
→ ···
- 1文字ずつ置換:
- コマンドモード
:%s/
BBB/
CCC/g
<Enter>- 置換範囲 : % すべての行
- 置換テキスト : BBBをCCCに
※ 正規表現の利用も可能(. : 任意の1文字、\n : 改行 等) - フラグ : g 各行の中でマッチしたすべてのテキストを置換
Vimのコマンド一覧を作成しましたので、他のコマンドが気になる方はどうぞ。
>>【動画あり】Vimのコマンドを一覧にまとめてみた