header image
  • プログラム・ソフト
  • 物理学・工学
  • ガジェット
  • 当サイトについて
  • お問い合わせ
  • プログラム・ソフト
  • 物理学・工学
  • ガジェット
  • 当サイトについて
  • お問い合わせ
  • HOME
  • プログラム・ソフト
  • Vim
  • Vimでサクッと置換する方法と置換コマンドの構成

Vimでサクッと置換する方法と置換コマンドの構成

投稿日:2022年4月17日 更新日:2022年6月15日

  • Tags: [コマンド集], [テキストエディター], [使い方],

サムネイル

Vimにも、他のテキストエディターと同様に置換機能があります。
置換する方法は主に2つあり、

  1. ノーマルモードのコマンドを使用したカーソル付近での置換
  2. コマンドモードのコマンドによるファイルの指定領域での置換

があります。個人的には、
カーソル付近のテキストをサクッと置換したいときには "1. ノーマルモードのコマンド" を、
ファイル全体を置換したい場合には "2. コマンドモードによる置換"
をよく使っています。

  • カーソル付近の置換(文字変更)
    • 1文字ずつの変更
    • モーションを使った変更
    • 応用: 検索にヒットしたテキストを順に置換(サクっと置換)
  • ファイル全体・指定範囲を置換
    • 置換コマンドの構造
      • 1.置換範囲
      • 2.置換前後のテキスト
      • 3.フラグ
      • 4.デリミター(区切り文字)
  • 置換文字の表現方法(正規表現)
  • まとめ

カーソル付近の置換(文字変更)

1文字ずつの変更

r, Rコマンドによる1文字ずつの置換
Fig.1. r, Rコマンドによる1文字ずつの置換

操作コマンド
1文字のみ変更r
<Esc>を押すまで1文字ずつ変更R

カーソルに重なっている文字を置換(変更)します。
1文字変更してすぐノーマルモードに戻る場合はrコマンドを使い、
<Esc>キーを押すまで文字を変更し続ける場合はRコマンドを使います。

モーションを使った変更

オペレータcとモーションを組み合わせた置換
Fig.2. オペレータcとモーションを組み合わせた置換

操作コマンド
1行置換cc
カーソルから行末まで置換C
1単語置換ciw

モーションによって置換する範囲指定をしたい場合は、置換するオペレーターcを使ったコマンドが使えます。
cを使ったコマンドを使うと、モーションに対応した範囲のテキストを削除して挿入モードに入るので、ノーマルモードに戻るには <Esc>キーが必要になります。

モーションは、カーソル移動のコマンドかブロックを指定する文字が入ります。
詳しくは下記をどうぞ。
>> Vimのコマンドの表記とコマンドの基本構造(オペレーターとモーション)

応用: 検索にヒットしたテキストを順に置換(サクっと置換)

検索と繰り返しを併用したファイル全体の置換
Fig.3. 検索と繰り返しを併用したファイル全体の置換

操作コマンド
検索にヒットした文字を順に変更/{置換前テキスト}<Enter> → ciw → {置換後テキスト}<Esc> → n. → n. → ···
カーソル上の文字と同じ文字を順に変更*N → ciw → {置換後テキスト}<Esc> → n. → n. → ···

上記で取り上げたr, cコマンドと検索 /{キーワード} コマンド、 繰り返し . コマンドを組み合わせることで、
上部(または下部)から順にファイル全体の置換を行っていくことが可能です。
組み合わせに使用しているコマンドは下記になります。

  • /{キーワード}<Enter>: 検索
  • * : カーソル上の単語を検索
  • n : 検索にマッチする、次のテキスト位置に移動
  • N : 検索にマッチする、前のテキスト位置に移動
  • . : 前回に使用したコマンドを繰り返す

検索コマンドでは、正規表現を使った柔軟な検索も可能です。
正規表現で使える文字の一例を後に示しておきます。

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

コマンドモードの置換
Fig.4. コマンドモードの置換

コマンドモードを使った置換方法もあります。
ファイル全体の置換や指定した行内での置換などが行えます。

ファイル内に存在するすべてのBBBをCCCに置換するコマンドは下記になります。

:%s/BBB/CCC/g<Enter>

置換コマンドの構造

置換コマンドの構成
Fig.5. 置換コマンドの構成

コマンドモードでの置換コマンドの構成は、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. → ···
  • コマンドモード
    • :%s/BBB/CCC/g<Enter>
      • 置換範囲 : % すべての行
      • 置換テキスト : BBBをCCCに
        ※ 正規表現の利用も可能(. : 任意の1文字、\n : 改行 等)
      • フラグ : g 各行の中でマッチしたすべてのテキストを置換

Vimのコマンド一覧を作成しましたので、他のコマンドが気になる方はどうぞ。
>>【動画あり】Vimのコマンドを一覧にまとめてみた

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Windows上のVSCodeでWSLのgitを使う

Vim (Vi)でコピー&ペーストするコマンドまとめとエディタ外部間で行う方法

Vimのコマンドの表記とコマンドの基本構造(オペレーターとモーション)

VSCodeのPython(Jupyter)のショートカットと表示設定

【初心者向け】FreeCADの基本的な使い方と手順の流れ

Vimのレジスタの種類とコマンドの使い方・構造

Vimの改行コマンドと改行コードの操作

Win11にWSLインストール(エラー発生したので備忘録)

  • プロフィール

  • Yoshiharu

  • 現在、ひよっこ光学系エンジニアをやっている一般人です。我流でプログラムをいじったりしています。備忘録、知識整理を兼ねてアウトプットをしていく予定です。

    • 【ラズパイ】格安な抵抗式・静電容量式の土壌湿度センサーを実際に使って比較

      2022.11.23

      【ラズパイ】格安な抵抗式・静電容量式の土壌湿度センサーを実際に使って比較


    • ELEGOO Neptune 2Sをレビュー!2万円台3Dプリンターの実力を実際に使って評価!

      2022.11.03

      ELEGOO Neptune 2Sをレビュー!2万円台3Dプリンターの実力を実際に使って評価!


    • 自作ラズパイゼロケースを3Dプリンター用にモデリング【FreeCAD】

      2022.10.13

      自作ラズパイゼロケースを3Dプリンター用にモデリング【FreeCAD】


    • 【初心者向け】FreeCADの基本的な使い方と手順の流れ

      2022.10.11

      【初心者向け】FreeCADの基本的な使い方と手順の流れ


    • 【Python】ラズパイでLチカ:LEDの取り扱い~抵抗値の計算

      2022.09.07

      【Python】ラズパイでLチカ:LEDの取り扱い~抵抗値の計算


  • アーカイブ

    • 2022年11月
    • 2022年10月
    • 2022年9月
    • 2022年8月
    • 2022年5月
    • 2022年4月
    • 2022年3月
    • 2022年1月
    • 2021年11月
    • 2021年9月
    • 2021年8月
    • 2021年7月
    • 2021年2月
    • 2021年1月
    • 2020年12月
    • 2020年10月
    • 2020年9月
    • 2020年8月
    • 2020年7月
    • 2020年3月
    • 2020年2月
    • 2020年1月
  • カテゴリー

    • Vim
    • ガジェット
    • プログラム・ソフト
    • 光学
    • 情報処理
    • 物理学・工学
    • プログラム・ソフト
    • 物理学・工学
    • ガジェット
    • 当サイトについて
    • お問い合わせ
    Y Lab Desk

    Copyright © Y Lab Desk, 2022 All Rights Reserved.