開発環境/ツール

【Vim】コマンドラインモードで文字列置換してみる

【※ 当記事は2020年7月2日時点の情報です】

ペイヴメント(@pavement1234)です。

エンジニア
エンジニア

Vimのコマンドラインモードで文字列置換する方法を知りたい

こんな悩みを解決します。

Vimのコマンドラインモードでできることというページを発見。Vimと言っていますが、ViというよりExコマンドのことを書いてますね。そういえば1999年に入社したソフトウェアハウスはUNIXでviを触れないと食っていけない会社だったので、新人研修の資料に同じようなことが書いてあったのを思い出し、非常に懐かしく感じました。

文字列置換

これからファイルの中のpavement12344321tnemevapに変換します。置換はsubstituteのsです。

ファイルをvimで開きます。

pavement1234
pavement5678
pavement12345678
pavement-1234
pavement9876
“a” 6L, 71C  4,1 全て

Escを押してコマンドラインモード(:)に入り、s/pavement1234/4321tnemevapと入力。

pavement1234
pavement5678
pavement12345678
pavement-1234
pavement9876
:s/pavement1234/4321tnemevap

リターンを打つとファイル内のpavement1234のうち1行目だけ4321tnemevapに置換されます。

4321tnemevap
pavement5678
pavement12345678
pavement-1234
pavement9876
:s/pavement1234/4321tnemevap 1,1 全て

:q!で保存せずファイルを閉じて、またvimで開きます。

pavement1234
pavement5678
pavement12345678
pavement-1234
pavement9876
“a” 6L, 71C 4,1 全て

Escを押してコマンドラインモードに入り、%s/pavement1234/4321tnemevap/gと入力。

pavement1234
pavement5678
pavement12345678
pavement-1234
pavement9876
:%s/pavement1234/4321tnemevap/g

リターンを打つとファイル内のpavement1234がすべて4321tnemevapに置換されます。

4321tnemevap
pavement5678
4321tnemevap5678
pavement-1234
pavement9876
:%s/pavement1234/4321tnemevap/g 3,1 全て

:q!で保存せずファイルを閉じて、またvimで開きます。

pavement1234
pavement5678
pavement12345678
pavement-1234
pavement9876
“a” 6L, 71C 4,1 全て

Escを押してコマンドラインモードに入り、%s/pavement1234/4321tnemevap/gcと入力。

pavement1234
pavement5678
pavement12345678
pavement-1234
pavement9876
:%s/pavement1234/4321tnemevap/gc

リターンを打つと4321tnemevap に置換しますか? (y/n/a/q/l/^E/^Y)  と聞かれるのでyと打ちリターン。

pavement1234
pavement5678
pavement12345678
pavement-1234
pavement9876
4321tnemevap に置換しますか? (y/n/a/q/l/^E/^Y) 1,1 全て

1行目がpavement1234から4321tnemevapに置換されます。まだ候補があるので再び4321tnemevap に置換しますか? (y/n/a/q/l/^E/^Y)  と聞かれるのでyと打ちリターン。

4321tnemevap
pavement5678
pavement12345678
pavement-1234
pavement9876
4321tnemevap に置換しますか? (y/n/a/q/l/^E/^Y) 1,1 全て

2つ目の候補もpavement1234から4321tnemevapに置換されます。

4321tnemevap
pavement5678
4321tnemevap5678
pavement-1234
pavement9876
4321tnemevap に置換しますか? (y/n/a/q/l/^E/^Y) 1,1 全て

:q!で保存せずファイルを閉じて終わます。

置換コマンドをまとめた

:s/before/after カーソル行の文字列”before”を”after”に置換。
:s/before/after/g カーソル行の文字列”before”をすべて“after”に一括置換
:s/before/after/gc カーソル行の文字列”before”をすべて“after”に置換。確認を表示させる。
:%s/before/after/g 現在開いているファイルの文字列”before”を”after”に一括置換。
:%s/before/after/gc 現在使っているファイルの文字列”before”を”after”に置換。確認を表示させる。
:%s;/var/home;/usr/home;gc パス名などを置換するときは、”/”でなく、”;”を区切り文字に使用
:63,79s /aaa/bbb/g 特定範囲のみ置換。 63~79行目までの範囲にある”aaa”を”bbb”に一括置換

 

おまけ(スマイル)

Escを押してコマンドラインモードに入り:smileと打つと、こうなります。

まとめ

Vimのコマンドラインモードで文字列置換してみました。小ネタがまとまったらまた発信します。

ABOUT ME
ペイヴメント
ペイヴメントのエンジニア塾(当ブログ)では20年以上の経験から得られたプログラミング系ノウハウについてベテランにも満足して頂けるような内容の濃いコンテンツを初心者にも分かりやすい形で日々発信しています。【経歴】ベンチャーのソフトハウスで4年勤務後、精密機器メーカーのソフト開発部門に勤務し今に至ります。