Vimの置換のメモ
vimのexコマンドで:コマンド/検索文字列/置換文字列/
と入力すると、vimに組み込まれたsed
が実行されます。通常のsed
とかなり似ていますが、vim用に調整されています。ここで例にあげるパターン(検索文字列)は、完全一致にしています。
置換の基本
対象となる文字列
hoge HOGE hoge
置換するには、:s
コマンドを使います。s
は置換(substitute)の意味です。
そのまま実行すると、カレント行(カーソルがある行)で最初にマッチしたパターン「のみ」が置換されます。
:s/hoge/fuga/
fuga HOGE hoge
行末にg
をつけると、カレント行でマッチしたすべてのパターンが置換されます。
:s/hoge/fuga/g
fuga HOGE fuga
行末にc
をつけると、確認が行われます。
:s/hoge/fuga/c
replace with d (y/n/a/q/l/^E/^Y)?
行末にi
をつけた場合は、大文字小文字を無視して置換します。:set ignorecase
が設定されている場合は、自動で機能します。
:s/hoge/fuga/g
fuga fuga fuga
範囲を指定する
対象となる文字列
#include <stdio.h>
void main(void) {
printf("hello, world");
printf("hello, world");
printf("hello, world");
printf("hello, world");
}
置換したい文字列が複数ある場合は、一行ずつ置換すると大変です。そこで、範囲を指定して置換します。
:%s
コマンドを使うと、1行目から最終行までのファイル全体が対象になります。
:%s/printf/puts/
#include <stdio.h>
void main(void) {
puts("hello, world");
puts("hello, world");
puts("hello, world");
puts("hello, world");
}
コマンドの前に行番号を付けると、その行が対象になります。
:4s/")/\\n")/
#include <stdio.h>
void main(void) {
printf("hello, world");
printf("hello, world\n");
printf("hello, world");
printf("hello, world");
}
行番号を:開始行,終了行
と区切ると、その範囲の複数行が対象になります。次の例だと、4〜5行目です。
:4,5s/")/\\n")/
#include <stdio.h>
void main(void) {
printf("hello, world");
printf("hello, world\n");
printf("hello, world\n");
printf("hello, world");
}
行番号のどちらかを省略すると、カレント行の意味になります。
1行目からカレント行までを、カレント行から最終行($
)を対象にするには、次のようにします。カレント行は4行目ということにします。
:1,s/printf(/fprintf(stdout, /
#include <stdio.h>
void main(void) {
fprintf(stdout, "hello, world");
fprintf(stdout, "hello, world");
printf("hello, world");
printf("hello, world");
}
:,$s/printf/fprintf(stderr, /
#include <stdio.h>
void main(void) {
printf("hello, world");
fprintf(stderr, "hello, world");
fprintf(stderr, "hello, world");
fprintf(stderr, "hello, world");
}
他にも、:a,bs/
のように、vimのマーク(m
)を利用することもできますし、行選択(V
)で範囲を決めることもできます。行選択は、視覚的に確認できることもあって、筆者はもっぱらこの方法ばかり使っています。
文字列の有無で行を削除する
対象となる文字列
#include <stdio.h>
void main(void) {
// show message
puts("hello, world");
// end
}
:g
や:v
コマンドを使って、不要な行を削除することができます。
:g
は、対象の文字列がある行を削除します。つぎの例では、//
のコメントアウトがある行を削除しています。
:g/\/\//d
#include <stdio.h>
void main(void) {
puts("hello, world");
}
:v
は、対象の文字列がない行を削除します。つぎの例では、//
のコメントアウトがない行を削除しています。
:v/\/\//d
// show message
// end
改行の扱いについて
対象となる文字列
int main(void) {
puts("hello, world");
return 0;
}
改行を追加したり削除する時、ラインフィードは\n
(^M
)、キャリッジリターンは\r
(^K
を指定します。
改行を削除するときは、\n
を用います。
:1s/\n//
int main(void) {
return 0;
}
応用で空行を削除することもできます。
:s/^ *\n//
改行を追加するときは、\r
を用います。例では);
の後で改行させています。
:s/);/);\r/
int main(void) {
puts("hello, world");
return 0;
}
複数ファイルを対象に置換する
あまり使いませんが、vimで複数のファイルをまとめて置換する方法もあります。:args
でファイルをバッファに読み込んで処理をします。
カレントにあるtxt
ファイルを全て読み込みます。
:args ./*.txt
:args
で、読み込んだファイルが確認できます。
:args
[test.txt] a.txt b.txt c.txt
読み込んだファイルに問題がなければ、:argdo
の引数にsed
とupdate
を記事します。update
がないと、一つずつ保存しなければなりません。なお、この時のs
は全体を対象とします。
:argdo %s/hoge/fuga/g | update
更新情報
- 作成日:2019-xx-xx
- 更新日:2022-04-30