Vimでの置換操作を完全マスター!基本から応用まで徹底解説

プログラミング・IT

テキスト編集の効率を格段に上げるコマンドのひとつが「置換」です。

同じ文字列を何度も手作業で修正するのは時間がかかりますが、置換機能を使えば一瞬で完了します。

特にVimは、非常に強力な検索・置換機能を備えており、正規表現などを使うことで複雑な変換も一発で実現できます。

例えば:

  • 「すべての『old』を『new』に変更したい」
  • 「HTMLタグをすべて削除したい」
  • 「数字だけを別の文字に置き換えたい」
  • 「特定の行だけで置換したい」

しかし、Vim特有の記法に戸惑う初心者も少なくありません。

「コロンから始まるコマンドって何?」
「スラッシュの意味がわからない…」
という経験をしたことはありませんか?

この記事では、Vimでの置換操作を基本から応用まで順を追ってわかりやすく解説します。

スポンサーリンク
  1. Vimとは?置換を理解する前の基本知識
    1. Vimエディタの特徴
    2. Vimのモードを理解しよう
    3. 置換コマンドの実行方法
  2. 基本的な置換コマンド:ステップバイステップ
    1. 最もシンプルな置換
    2. 具体的な例で理解しよう
    3. 基本オプション:g(global)
    4. 基本オプション:c(confirm)
    5. 複数オプションの組み合わせ
  3. ファイル全体・範囲指定での置換
    1. ファイル全体での置換
    2. 具体的な使用例
    3. 行番号を指定した範囲置換
    4. ビジュアルモードでの範囲指定
  4. 正規表現を使った高度な置換
    1. 正規表現とは?
    2. 基本的な正規表現パターン
    3. 実用的な正規表現置換例
    4. より高度な正規表現例
  5. 特殊な置換テクニック
    1. 大文字・小文字の変換
    2. 行の並び替えや加工
    3. 空行の処理
  6. よくある間違いとトラブル対策
    1. エラー1:「Pattern not found」
    2. エラー2:意図しない文字まで置換された
    3. エラー3:特殊文字が正しく処理されない
    4. エラー4:置換後に元に戻したい
  7. 実践的な使用例とテクニック
    1. プログラミングでの活用例
    2. ドキュメント編集での活用例
    3. ログファイル処理での活用例
  8. 効率を上げる置換テクニック
    1. 履歴機能の活用
    2. マクロと組み合わせた高度な置換
    3. 複数ファイルでの一括置換
  9. 設定とカスタマイズ
    1. よく使う置換の設定化
    2. 便利なキーマッピング
  10. トラブルシューティング完全ガイド
    1. よくある質問と回答
    2. デバッグとテスト方法
  11. まとめ:Vim置換マスターへの道
    1. 基本コマンドの復習

Vimとは?置換を理解する前の基本知識

Vimエディタの特徴

Vimは、Unix/Linux系システムで広く使われている高機能なテキストエディタです。

キーボードだけですべての操作ができるため、マウスを使わずに高速な編集作業が可能です。

Vimの主な特徴

  • モード切り替え:編集モード、コマンドモードなど用途別のモード
  • 強力な検索・置換:正規表現を使った高度な文字列処理
  • 豊富なショートカット:効率的なキーボード操作
  • カスタマイズ性:設定ファイルで自分好みにカスタマイズ可能

Vimのモードを理解しよう

Vimには複数のモードがあり、置換操作は主にコマンドモードで行います。

主要なモード

  • ノーマルモード:カーソル移動や文字削除など(Vim起動時のデフォルト)
  • インサートモード:文字入力モード(iキーで切り替え)
  • コマンドモード:コマンド実行モード(:キーで切り替え)

置換コマンドの実行方法

置換を行うには、以下の手順を行います:

  1. ノーマルモードに戻る(Escキーを押す)
  2. **コロン(:)**を押してコマンドモードに入る
  3. 置換コマンドを入力
  4. Enterキーで実行

画面下部に: が表示されたら、コマンド入力の準備完了です。

基本的な置換コマンド:ステップバイステップ

最もシンプルな置換

Vimでの置換の基本形は以下の通りです:

:s/検索文字列/置換文字列/

各部分の意味

  • ::コマンドモードの開始
  • s:substitute(置換)コマンド
  • /:区切り文字(検索文字列と置換文字列を分ける)
  • 検索文字列:置き換えたい文字列
  • 置換文字列:新しい文字列

具体的な例で理解しよう

例1:単語の置換

:s/hello/hi/

この場合:

  • 現在のカーソル行で最初に見つかった
  • **「hello」「hi」**に置換

実行前

hello world, hello everyone!

実行後

hi world, hello everyone!

最初の「hello」だけが置換され、2番目の「hello」はそのまま残ります。

基本オプション:g(global)

行内のすべての該当文字列を置換したい場合は、gオプションを使います:

:s/hello/hi/g

実行前

hello world, hello everyone!

実行後

hi world, hi everyone!

すべての「hello」が「hi」に置換されました。

基本オプション:c(confirm)

置換前に確認したい場合は、cオプションを使います:

:s/hello/hi/gc

実行すると、以下のような確認画面が表示されます:

replace with hi (y/n/a/q/l/^E/^Y)?

選択肢の意味

  • y:Yes(この箇所を置換)
  • n:No(この箇所をスキップ)
  • a:All(残りをすべて置換)
  • q:Quit(置換を終了)
  • l:Last(この箇所を置換して終了)

複数オプションの組み合わせ

:s/old/new/gc

このコマンドは:

  • g:行内のすべての「old」が対象
  • c:各箇所で確認してから置換

ファイル全体・範囲指定での置換

ファイル全体での置換

現在の行だけでなく、ファイル全体で置換を行うには、**%(パーセント)**を使います:

:%s/old/new/g

各部分の意味

  • %:ファイル全体を指定
  • s:置換コマンド
  • old:検索する文字列
  • new:置換後の文字列
  • g:行内のすべてを対象

具体的な使用例

例:プログラムの変数名変更

:%s/oldVariableName/newVariableName/g

実行前

let oldVariableName = 5;
function test() {
    console.log(oldVariableName);
    return oldVariableName * 2;
}

実行後

let newVariableName = 5;
function test() {
    console.log(newVariableName);
    return newVariableName * 2;
}

行番号を指定した範囲置換

特定の行だけで置換を行いたい場合:

指定した行範囲での置換

:10,20s/foo/bar/g
  • 10,20:10行目から20行目まで
  • foobarに置換

現在行から末尾までの置換

:.,$s/foo/bar/g
  • .:現在の行
  • $:ファイルの最後の行

ファイルの先頭から特定行までの置換

:1,50s/foo/bar/g
  • 1,50:1行目から50行目まで

ビジュアルモードでの範囲指定

ビジュアルモードを使って範囲を選択してから置換することもできます:

  1. vキーでビジュアルモードに入る
  2. カーソルキーで範囲を選択
  3. **:**を押す(自動的に:'<,'>が入力される)
  4. s/old/new/gを追加して実行
:'<,'>s/old/new/g

正規表現を使った高度な置換

正規表現とは?

**正規表現(Regular Expression)**は、文字列のパターンを表現するための特別な記法です。これを使うことで、より柔軟で強力な置換が可能になります。

基本的な正規表現パターン

よく使用される正規表現

パターン意味
.任意の1文字a.cabc, axc
*直前の文字が0回以上ab*cac, abc, abbc
\+直前の文字が1回以上ab\+cabc, abbc
[0-9]数字[0-9]\+123, 4567
[a-zA-Z]アルファベット[a-zA-Z]\+Hello, world
^行の始まり^Hello → 行頭の「Hello」
$行の終わりworld$ → 行末の「world」

実用的な正規表現置換例

例1:すべての数字を削除

:%s/[0-9]\+//g

実行前

Price: 100 dollars, Tax: 10 percent
Order ID: 12345, Date: 2024

実行後

Price:  dollars, Tax:  percent
Order ID: , Date: 

例2:行頭の空白を削除

:%s/^ \+//g

実行前

    Hello World
        This is indented
  Another line

実行後

Hello World
This is indented
Another line

例3:HTMLタグの除去

:%s/<[^>]*>//g

実行前

<p>This is <strong>bold</strong> text.</p>
<div class="container">Content here</div>

実行後

This is bold text.
Content here

より高度な正規表現例

例4:メールアドレスの形式変更

:%s/\([a-zA-Z0-9._-]\+\)@\([a-zA-Z0-9.-]\+\)/[\1 at \2]/g

実行前

Contact: john@example.com
Support: help@company.org

実行後

Contact: [john at example.com]
Support: [help at company.org]

例5:日付形式の変換

:%s/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\3\/\2\/\1/g

実行前

Date: 2024-03-15
Deadline: 2024-12-31

実行後

Date: 15/03/2024
Deadline: 31/12/2024

特殊な置換テクニック

大文字・小文字の変換

全て大文字に変換

:%s/.*/\U&/g

全て小文字に変換

:%s/.*/\L&/g

最初の文字のみ大文字に変換

:%s/\<\w/\u&/g

行の並び替えや加工

各行の先頭に番号を追加

:%s/^/\=line('.') . '. '/g

実行前

First item
Second item
Third item

実行後

1. First item
2. Second item
3. Third item

各行の末尾に文字を追加

:%s/$/ - completed/g

実行前

Task A
Task B
Task C

実行後

Task A - completed
Task B - completed
Task C - completed

空行の処理

空行を削除

:%s/^\n//g

または

:g/^$/d

複数の空行を1つにまとめる

:%s/\n\{2,}/\r\r/g

よくある間違いとトラブル対策

エラー1:「Pattern not found」

症状

E486: Pattern not found: searchtext

原因と対処法

  • 検索文字列が存在しない:スペルを確認
  • 大文字小文字の違い\cオプションで無視
  • 正規表現の記法ミス:特殊文字のエスケープを確認

解決例

" 大文字小文字を無視して検索
:%s/hello/hi/gi

" または
:%s/\chello/hi/g

エラー2:意図しない文字まで置換された

症状 「hello」を置換しようとしたら「othello」も「othhi」になってしまった

対処法 単語境界を指定する:

:%s/\<hello\>/hi/g
  • <:単語の始まり
  • >:単語の終わり

エラー3:特殊文字が正しく処理されない

エスケープが必要な文字

" スラッシュを置換する場合
:%s/\/path\/to\/file/\/new\/path/g

" または区切り文字を変更
:%s#/path/to/file#/new/path#g

よくエスケープが必要な文字

  • / \ * + ? . ^ $ [ ] ( )

エラー4:置換後に元に戻したい

アンドゥ(取り消し)

u

やり直し

Ctrl + r

複数回のアンドゥ

:u      " 1回戻る
:2u     " 2回戻る

実践的な使用例とテクニック

プログラミングでの活用例

例1:JavaScript関数名の変更

:%s/\<oldFunctionName\>/newFunctionName/g

例2:CSS クラス名の一括変更

:%s/\.old-class/\.new-class/g

例3:HTMLの属性値変更

:%s/class="\([^"]*\)"/class="new-\1"/g

実行前

<div class="container">
<p class="text">

実行後

<div class="new-container">
<p class="new-text">

ドキュメント編集での活用例

例1:マークダウンの見出しレベル変更

:%s/^##/###/g

例2:URLの形式変更

:%s/http:/https:/g

例3:日本語の句読点統一

:%s/、/,/g
:%s/。/./g

ログファイル処理での活用例

例1:日時形式の標準化

:%s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)/\3-\1-\2/g

例2:不要なログレベルの削除

:%s/^\[DEBUG\].*\n//g

例3:IPアドレスのマスキング

:%s/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/XXX.XXX.XXX.XXX/g

効率を上げる置換テクニック

履歴機能の活用

コマンド履歴

  • :を押した後、↑キーで過去のコマンドを呼び出し
  • Ctrl+Pでも同様の操作が可能

検索履歴

  • /を押した後、↑キーで過去の検索パターンを呼び出し

マクロと組み合わせた高度な置換

マクロの記録

qa                    " aレジスタにマクロ記録開始
:s/pattern/replacement/g
Enter
q                     " マクロ記録終了

マクロの実行

@a                    " マクロを1回実行
10@a                  " マクロを10回実行

複数ファイルでの一括置換

args コマンドと組み合わせ

:args *.txt           " すべての.txtファイルを開く
:argdo %s/old/new/ge | update
  • argdo:すべてのファイルに対して実行
  • e:エラーを無視
  • update:変更があれば保存

設定とカスタマイズ

よく使う置換の設定化

.vimrcファイルに以下を追加すると便利です:

" 置換時に確認を省略
set gdefault

" 検索時の大文字小文字を賢く処理
set ignorecase
set smartcase

" 置換のハイライト表示
set hlsearch

" インクリメンタル検索
set incsearch

便利なキーマッピング

" よく使う置換をショートカット化
nnoremap <Leader>r :%s/\<<C-r><C-w>\>//g<Left><Left>

このマッピングにより、カーソル下の単語を自動的に検索文字列として設定できます。

トラブルシューティング完全ガイド

よくある質問と回答

Q: 置換コマンドが効かない A: 以下を確認してください:

  1. ノーマルモードにいるか(Escを押す)
  2. コロン(:)から始まっているか
  3. 検索文字列が実際に存在するか

Q: 正規表現が動作しない A: Vimでは一部の正規表現文字にエスケープが必要です:

" 正しい書き方
:%s/[0-9]\+/NUMBER/g

" 間違い
:%s/[0-9]+/NUMBER/g

Q: 置換後の表示がおかしい A: 画面を再描画してください:

Ctrl + L

Q: 大量の置換で処理が重い A: 以下で高速化できます:

:set lazyredraw      " 描画を遅延
:%s/pattern/replacement/g
:set nolazyredraw    " 描画遅延を解除

デバッグとテスト方法

置換前のテスト

" 実際の置換前に該当箇所を確認
/pattern

" 該当数を確認
:%s/pattern//gn

段階的な置換

" まず1行だけでテスト
:s/pattern/replacement/g

" 問題なければ全体に適用
:%s/pattern/replacement/g

まとめ:Vim置換マスターへの道

Vimの置換機能について、基本から応用まで詳しく解説してきました。重要なポイントをまとめます:

基本コマンドの復習

単発置換

:s/old/new/          " 現在行の最初の1個だけ
:s/old/new/g         " 現在行のすべて

全体置換

:%s/old/new/g        " ファイル全体
:%s/old/new/gc       " 確認しながら全体置換

範囲指定置換

:10,20s/old/new/g    " 10〜20行目
:.,$s/old/new/g      " 現在行〜末尾

コメント

タイトルとURLをコピーしました