vimでの置換処理のやり方をメモしておきます。
vim で置換処理
コマンド入力となるのでノーマルモードで:(コロン)に続けて入力します。
全行置換
%は、カレントファイル(現在編集中の1つのファイル)のみという意味です。
1 |
:%s/置換前語句/置換後語句/ |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
test1 test2 test3 test4 test5 test6 test7 test8 test9 ~ :%s/test/tet/ |
この時、下のように1行に1回だけ置換されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
tet1 tet2 tet3 tet4 test5 test6 tet7 tet8 test9 ~ 6 箇所置換しました (計 6 行内) |
全文置換
1行に複数あっても、すべて置換するときは、gオプションを付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
test1 test2 test3 test4 test5 test6 test7 test8 test9 ~ :%s/test/tet/g |
下のように全部変換されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
tet1 tet2 tet3 tet4 tet5 tet6 tet7 tet8 tet9 ~ 9 箇所置換しました (計 6 行内) |
指定した範囲だけ置換する
まず、Shift + v あるいは、v でビジュアルモードに入って、カーソルを動かして範囲を指定します。
下図では、v を押してビジュアルモードに入っています。灰色に反転している部分が、選択した部分です。V だと、行単位での選択ができます。
ビジュアルモードのまま、「:」を入力すると、下図のように、選択範囲でのコマンドモードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
test1 test2 test3 test4 test5 test6 test7 test8 test9 ~ :'<,'> |
このまま、
1 |
s/置換前語句/置換後語句/g |
と入力すると、選択した範囲で置換することができます。
注意してほしい点は、行単位で制御されていることです。
gオプションを付けたら、選択範囲外でも同じ行は処理されます。逆にgを付けない場合は、各行で最初の該当語句だけ変換されます。
置換前の文字を利用
「\(」と「\)」でくくって、\1、\2 のように引用することで、文字を置換後の文字列として利用できます。
下のリストでは、test という文字列を利用して、test phrase と置換しようとする際に、test の部分を再利用してます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
test1 test2 tetete3 tetete4 tetete5 tetete6 test7 test8 test9 ~ :%s/\(test\)/\1 phrase/g |
(には、\(円マーク=バックスラッシュ)を付ける必要があるので注意してください。下のリストのように 「test」→「test phrase」と変換されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
test phrase1 test phrase2 tetete3 tetete4 tetete5 tetete6 test phrase7 test phrase8 test phrase9 ~ 5 箇所置換しました (計 4 行内) |
正規表現を使った置換
\(、\)と、\数字による文字列の利用は、正規表現と一緒に使わないとあまり便利じゃないです。だって、決まった文字列 だったらもうわかってるんですから。
正規表現を使って、例えば、下のように、「test1」とか、「tetete2」 という文字列を「The test No.1」とか「The tetete No.2」のように、The と No. を挿入したいとき、\数字による文字列の利用が役に立ちます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
test1 test2 tetete3 tetete4 tetete5 tetete6 test7 test8 test9 ~ :%s/\(t.\{-,}\)\([0-9]\)/The \1 No.\2./g |
結果は下の通り。
正規表現の説明
1 |
:%s/\(t.\{-,}\)\([0-9]\)/The \1 No.\2./g |
は、正規表現がふんだんに入った表現ですが、 \(t.\{-,}\)\([0-9]\) を説明しますと、
「 t で始まって、そのあと .が、 {-,} だけ続いて、そのあと[0-9]の文字が続いている文字列」
ということになります。
正規表現 | 説明 | 例 |
. | 改行以外の任意の一文字 |
Tの後任意の一文字が続く文字列を検索 |
\{n,m} |
直前の文字がn回以上
|
/at\{2,4} で、aのあとtが2回以上4回以下で続く文字列のうち、最長を検索 |
\{-n,m} |
直前の文字がn回以上
|
/at\{-2,4} で、aの後tが2回以上4回以下で続く文字列のうち、最短を検索 |
\{,} |
直前の文字が0回以上 |
/at\{,} で、aの後tが0回以上続く文字列のうち、最長を検索 |
\{-,} | 直前の文字が0回以上 続く最短の文字列 |
/at\{-,} で、aの後tが0回以上続く文字列のうち、最短を検索 |
[0-9] | 0~9 の文字1つに相当する。 | |
まとめ
vimで置換するときは、:s コマンドを使います。
- :%s でファイル全体置換
- ヴィジュアルモードで選択した後:s で範囲内置換
- gオプションで1行に複数あっても全部置換
- \(、\)で囲って、\数字で置換前文字列を参照
- 正規表現と合わせると置換前文字列の参照は超便利
vimの基本的な使い方は、記事「vimの使い方。最低限の操作ができるようになるまで」に書いてます。あわせてご覧ください。
コメント