Vimの基礎知識

【Vimの基礎知識】正規表現を使った高度なテキスト編集

テキストを一括で整形したいとき、Vimでどこまで効率化できるのかと考えたことはありませんか。

単純な検索や置換では限界があり、複雑な条件を満たす編集になると、どうしても一行ごとに手作業が必要になります。

その最大の壁を乗り越える鍵となるのが「正規表現」です。正規表現は、文字列のパターンを定義して必要な部分だけを抽出・編集できる仕組みであり、Vimではこれをさらに強力に拡張しています。

独自の“magic”モードやゼロ幅境界、先読み・後読みといった高度な記法を駆使すれば、「特定の単語で始まり数字で終わる行だけを対象にする」処理や、「複数ファイルをまとめて修正する」といった高度な操作も可能です。

現場では「特定のパターンを一括修正したい」「条件に合う部分だけを置換したい」といった要望が頻繁に発生しますが、正規表現を習得すれば時間の浪費や誤操作のリスクを最小限に抑えられます。

VimはUNIX系エディタの伝統を受け継ぎつつ独自の構文を備えており、膨大なファイル編集を安全かつ効率的に処理できるのです。

本記事では、Vimにおける正規表現の基本から:substituteコマンドの実践的な活用、複数ファイルをまたいだ一括処理、そして安全に運用するための検証手順までを体系的に整理します。

読み終えたときには、業務でそのまま活かせる高度な編集スキルを身につけられるでしょう。

Vimの基礎知識

🟢 Vimの基礎知識
📌 Linuxで必ず触れるテキストエディタの入門から応用までを体系化
 └─【Vimの基礎知識】入門から応用までを体系化した学習ロードマップ
   ├─ 入門編(初心者向け)
   | ├─ 【Vimの基礎知識】ゼロから始めるVim入門とモード終了、コマンド基本操作
   | ├─ 【Vimの基礎知識】テキスト編集の基本操作(挿入・削除・移動) 
   | ├─ 【Vimの基礎知識】viとvimの違い|現場で覚えるべきポイント
   | ├─ 【Vimの基礎知識】VimとEmacsの違い|Linux現場で使われるエディタの選び方
   | └─ 【Vimの基礎知識】主要コマンド一覧|移動・編集・検索・コピーモード切替の早見表
   ├─ 活用編(中級者向け)
   | ├─ 【Vimの基礎知識】検索・置換・コピー・ペーストの操作まとめ
   | └─ 【Vimの基礎知識】マウス不要!カーソルを乗せたら勝ち確定|ビジュアルモード
   ├─ 実践編(実務で役立つ)
   | ├─ 【Vimの基礎知識】Vimで複数ファイルを同時編集する方法とウィンドウ分割の基本
   | └─ 【Vimの基礎知識】外部コマンド&シェル連携でVimを超実用ツールへ進化
   ├─ 応用編(上級者向け)
   | ├─ 【Vimの基礎知識】マクロを活用した自動編集テクニック
   | └─ 【Vimの基礎知識】正規表現を使った高度なテキスト編集
   └─ 設定編(カスタマイズ)
     ├─ 【Vimの基礎知識】Vimを使いこなす基礎:.vimrcで快適な開発環境を構築する方法
     └─ 【Vimの基礎知識】VSCodeでVimを使う方法|GUIで再現するVim操作

この記事で学べる内容と到達点

この記事を通じて得られるメリットは大きく三つあります。

  • 第一に、正規表現を使って複雑な条件付き編集を一度に処理できるようになります。
  • 第二に、:global や :argdo を組み合わせた一括処理により、複数ファイルを効率よく編集できるようになります。
  • 第三に、誤操作を防ぐための検証方法やバックアップ手順を理解し、安全性を確保した上で編集作業を進められるようになります。

到達点は「大量データを正確に編集できる実践的な力」を身につけることです。

正規表現の基本とVim特有の指定

正規表現の活用を始めるにあたって、まず理解すべきはVim独自の構文です。

特に「magic指定」は正規表現の解釈に大きな影響を与えます。通常は \v を使うことでエスケープを最小化でき、パターンを簡潔に記述できます。

また、行頭・行末を表す ^ と $、単語境界を表す \< と \> はログ解析やコード整形に欠かせません。

さらに、\zs と \ze を組み合わせることで「置換範囲の開始と終了」を柔軟に定義できるため、狙った部分だけを精密に操作できます。

基本構文の代表例

以下はよく利用される構文を整理した表です。

構文意味利用シーン
^ / $行頭 / 行末設定ファイルやログの行単位処理
\< / \>単語境界変数名や単語単位での抽出
\vvery magicエスケープを減らして簡潔に書く
\zs / \ze置換範囲の開始 / 終了部分一致の一部だけを置換

正規表現の基本要素

「正規表現?」「表現に正規ってことは、不正規もあるのか?」「この正規表現って単語は日本語なのか?」――多くの人が最初にそんな疑問を抱きます。

さらに「げっ、これって黒い画面に呪文が並んでるやつ?」と身構え、「実を言うと、俺はこれでエンジニアを諦めた…」と感じた方もいるでしょう。

エンジニアとして次のステップに進もうとする時、最大の障壁として立ちはだかるのがこの「正規表現」です。

かく言う私自身も、何度も正規表現に心を折られた経験があります。なぜなら正規表現は、一度の操作で数百行を一気に書き換えてしまう強力な力を持つからです。

正しく使えば最強の武器(神)になりえますが、使い方を誤れば取り返しのつかない失敗を招く最大の呪文(悪魔)でもあります。

だからこそ、私は開発環境で何度も確認を繰り返しながら使うようにしています。それほどまでに正規表現はパワフルで、エンジニアとしての格を変えてしまう技術なのです。

この知識を習得する前と後では、まるで別のクラスに分かれるようなものです。習得後には、より高度な案件に挑戦でき、年収1000万円プレイヤーも夢ではなくなります。

Vimは一般的な正規表現エンジンに加えて独自の構文を備えており、これを理解することで作業効率は劇的に変わります。

例えば設定ファイルの整形やログ解析など、大量の繰り返し作業を一瞬で終わらせることができるのです。

ここでは「magic指定」「単語境界や行頭行末の指定」「複数行をまたぐマッチ」の3つを中心に整理し、実務で即使える力へとつなげます。

Vim固有の“magic”指定(\v, \m, \M, \V)です

Vimの正規表現では「magic」という仕組みが使われ、どの文字をメタ文字として解釈するかを切り替えられます。

これを理解することで、複雑なパターンを短く書けるようになり、逆に安全性を高めることもできます。

特に \v(very magic)はよく使われ、余計なエスケープを省いて読みやすいパターンを記述できます。

対象ファイル:sample.txt 内容:

apple pie
apple tart
grape pie

sample.txt を対象に「pie」という文字列を「sweet」に置換します。

:%s/\vpie/sweet/g

コマンド内訳

  • : コマンドラインモードの開始を意味します。
  • % 対象範囲を「全行」に指定します。ファイル全体が対象になります。
  • s substitute(置換)コマンドを意味します。
  • / パターンの区切り文字です。検索対象と置換後文字列を分けます。
  • \v "very magic" を意味します。正規表現の記法を簡略化し、特別な記号を多く正規表現として解釈させます。
  • pie 検索対象の文字列です。この場合は「pie」という文字列にマッチします。
  • /sweet 置換後の文字列を指定しています。「pie」を「sweet」に置き換えます。
  • /g グローバル指定です。行内に複数の「pie」があった場合、それらをすべて「sweet」に置換します。

このコマンドは \v によって “pie” をシンプルに指定し、全行を対象に置換します。

【出力例:】

apple sweet
apple tart
grape sweet

単語境界・行頭行末・マルチライン(<, >, ^, $, _.)

Vimの正規表現は、テキストの位置を厳密に制御するための指定が豊富に用意されています。

単語境界 \< と \> を使えば、部分一致による誤置換を防げます。行頭 ^ や行末 $ を使えば、パターンを行単位で制御できます。

また、\_. は改行を含めた任意の一文字にマッチし、複数行をまたいだ検索や置換が可能になります。

対象ファイル:file1.txt 内容:

start middle end
onlystart
the end

file1.txt を対象に、行末の「end」を「finish」に置換します。

:%s/end$/finish/g

コマンド内訳

  • : コマンドラインモードの開始を意味します。
  • % 範囲指定で「全行」を対象にします。ファイル全体が検索・置換の対象になります。
  • s substitute(置換)コマンドです。検索文字列を置換文字列に変える操作を行います。
  • /end$ 検索パターンです。 end … 文字列「end」 $ … 行末を意味する正規表現メタ文字。 → 行末が「end」で終わる部分だけにマッチします。
  • /finish 置換文字列です。マッチした「end」を「finish」に置き換えます。
  • /g 行内で該当するすべてのパターンを対象にします。 ただし今回は $ を使って「行末」に限定しているため、1行につき最大1回しか置換は発生しません。

このコマンドは $ を用いて「行末にある end のみ」を対象としています。

【出力例:】

start middle finish
onlystart
the finish

これらの基本要素を押さえることで、Vimの正規表現は単なる検索置換を超えて、実務的な編集力を飛躍的に高められます。

:substituteコマンドの応用

Vimで効率的にテキストを編集する上で最も多用されるのが:substituteコマンドです。

単純な置換から複雑な条件付きの処理まで幅広く対応できるため、正しく使いこなせば膨大な手作業を省き、大幅に時間を短縮できます。ここでは基礎的な置換から応用的な使い方まで順を追って整理します。

:substituteコマンドは単純な置換だけでなく、範囲指定や条件付きの処理、正規表現を組み合わせた複雑な編集にも対応できます。これらを「応用」として押さえておくことで、日常のファイル修正やログ整形を一瞬で終わらせることが可能になります。単なる文字の置き換えにとどまらず、複雑なルールを満たした編集まで自動化できる点が最大のメリットです。

単純置換と複雑置換の使い分け

基本的な使い方は、文字列を単純に置き換える方法です。

しかし実務では単純置換だけでは足りず、正規表現を活用した複雑なパターン置換が必要になる場面が多くあります。

対象ファイル: sample.txt 内容:

AAA_001
BBB_002
CCC_003

sample.txtを対象に下記のコマンドを実行することで、"AAA" を "XXX" に置き換えます。

:s/AAA/XXX/

【出力例:】

XXX_001
BBB_002
CCC_003

さらに、行全体に含まれる数字部分を統一的に「999」に置換する場合は、正規表現を利用します。

:%s/[0-9]\{3\}/999/g

コマンド内訳

  • : コマンドラインモードの開始を意味します。
  • % 範囲指定で「全行」を対象にします。ファイル全体が検索・置換の対象になります。
  • s substitute(置換)コマンドです。
  • /[0-9]\{3\}/ 検索パターンです。
    • [0-9] … 数字0〜9の1文字にマッチ。
      \{3\} … 直前のパターン(ここでは [0-9])が「ちょうど3回」連続するものにマッチ。
      → 結果として「任意の3桁の数字」にマッチします。
  • /999 置換文字列です。マッチした3桁の数字をすべて「999」に置き換えます。
  • /g 行内に複数マッチがあった場合、それらをすべて置換対象にします。

【出力例:】

XXX_999
BBB_999
CCC_999

範囲指定と条件付き置換

:substituteはファイル全体ではなく、範囲を限定して使うことも可能です。

大規模ファイルを扱う場合、この機能は誤操作を防ぐために非常に有効です。

対象ファイル: config.txt 内容:

server=dev01
server=dev02
server=prd01
server=prd02

このファイルで先頭2行のみに適用して "dev" を "stg" に変える場合は以下のようにします。

:1,2s/dev/stg/g

コマンド内訳

  • : コマンドラインモードの開始を意味します。
  • 1,2 範囲指定です。ここでは 1行目から2行目まで を対象にしています。
  • % の場合は全行ですが、ここでは限定範囲を指定しています。
  • s substitute(置換)コマンドです。
  • /dev/ 検索パターンです。文字列「dev」にマッチします。
  • /stg/ 置換文字列です。マッチした「dev」を「stg」に置き換えます。
  • /g グローバル指定。対象範囲の各行において、複数出現する「dev」をすべて「stg」に置換します。

【出力例:】

server=stg01
server=stg02
server=prd01
server=prd02

さらに条件付き置換として、「prd」のみが含まれる行に対してポート番号を追記する例を示します。

:g/prd/s/$/:8080/

コマンド内訳

  • : コマンドラインモードの開始を意味します。
  • g/prd/ global コマンド。ファイル全体を対象にして、検索パターンにマッチした行に対して後続コマンドを実行します。 ここでは「prd を含む行」を抽出しています。
  • s substitute(置換)コマンドです。
  • /$/ 検索パターンです。$ は「行末」を意味します。
  • :8080 置換文字列です。行末に「:8080」を追加します。

【出力例:】

server=stg01
server=stg02
server=prd01:8080
server=prd02:8080

実務での利用例

実務ではログファイルの整形や大量の設定変更などで:substituteが威力を発揮します。

例えばアクセスログに含まれるIPアドレスを一括でマスクする場合、正規表現を使って「192.168.」で始まる部分を「***.***.」に置き換えることができます。

対象ファイル: access.log 内容:

192.168.0.1 GET /index.html
192.168.0.2 POST /api/data
10.0.0.1 GET /contact.html

:%s/192\.168\.[0-9]\+\.[0-9]\+/***.***.X.X/g

【出力例:】

***.***.X.X GET /index.html
***.***.X.X POST /api/data
10.0.0.1 GET /contact.html

このように、:substituteコマンドはファイル全体を一瞬で書き換える「最強の編集呪文」とも言える存在です。

条件指定や正規表現を組み合わせれば、ミスを最小限に抑えつつ膨大な処理を効率的に進めることができます。

Vim正規表現リファレンス

Vim の正規表現は豊富で、ここに挙げる一覧を押さえておくと、ほぼすべての編集パターンに対応できます。

カテゴリ記号意味・用途
文字クラス[abc]a または b または c/[abc]/
文字クラス[^abc]a,b,c 以外/[^abc]/
文字クラス[0-9]0〜9 の数字/[0-9]/
文字クラス\d数字([0-9]と同じ)/\d\+/
文字クラス\D非数字/\D/
文字クラス\s空白(スペース、タブ等)/\s\+/
文字クラス\S非空白/\S\+/
文字クラス\w単語構成文字 [0-9A-Za-z_]/\w\+/
文字クラス\W非単語構成文字/\W/
量指定子*0回以上の繰り返し/ab*/
量指定子\+1回以上の繰り返し/a\+/
量指定子\=0回または1回/colou\=r/
量指定子\{m}ちょうど m 回/a\{3}/
量指定子\{m,}m 回以上/a\{2,}/
量指定子\{m,n}m〜n回/a\{2,4}/
位置指定^行頭/^Start/
位置指定$行末/end$/
位置指定\<単語の先頭/\<foo/
位置指定\>単語の末尾/bar\>/
位置指定\_^ファイル先頭/\_^From/
位置指定\_$ファイル末尾/\_$End/
特殊文字.任意の1文字/a.b/
特殊文字\_.改行を含む任意の1文字/foo\_.bar/
特殊文字\n改行文字/abc\n123/
特殊文字\rキャリッジリターン/foo\rbar/
グループ\( … \)部分式(グループ化)/\(foo\)\{2}/
参照\1, \2 …後方参照/\(foo\)\1/
ゼロ幅\zsマッチの開始位置を変更/foo\zsbar/
ゼロ幅\zeマッチの終了位置を変更/foo\zebar/
モード切替\mmagic(デフォルト)/foo\mbar/
モード切替\Mnomagic/foo\Mbar/
モード切替\vvery magic(多くを正規表現扱い)/\v(foo|bar)+/
モード切替\Vvery nomagic(多くをリテラル扱い)/\Vfoo.bar/
論理演算\|OR条件/foo\|bar/
論理演算\&AND条件/foo\&.*bar/
先読み\@=肯定先読み/foo\@=/
否定先読み\@!否定先読み/foo\@!/
後読み\@<=肯定後読み/\d\+\@<=/
否定後読み\@<!否定後読み/bar\@<!/
特殊指定\%d123ASCIIコード123にマッチ/\%d65/ (=A)
特殊指定\%x2A16進コードにマッチ/\%x41/ (=A)
特殊指定\%o1238進コードにマッチ/\%o101/ (=A)
特殊指定\%u20ACUnicodeコードにマッチ/\%u3042/ (=あ)
特殊指定\%23l23行目限定でマッチ/foo\%23l/
特殊指定\%>23l23行目より後でマッチ/bar\%>23l/
特殊指定\%#カーソル位置にマッチ/\%#foo/

ゼロ幅指定と先読み・後読み

Vimで正規表現を活用する際に、編集の柔軟性を一気に高めるのが「ゼロ幅指定」と「先読み・後読み」です。

これらは文字を消費せずに条件だけを課す仕組みであり、必要な範囲をピンポイントで操作できるため、不要な置換を避けたり、誤編集を防ぐ強力な手段になります。

単純なパターンマッチでは難しかった細やかな編集も、これらを理解すれば短時間で効率的に行えるようになります。

\zs と \ze による範囲制御

\zs と \ze を使うと、マッチ全体のうちどこからどこまでを実際の対象とするかを柔軟に制御できます。

これにより、パターンの一部を残しつつ必要な部分だけ置換することが可能になります。

対象ファイル: sample.txt 内容:

error: file not found
error: access denied
warning: low memory

「error:」の後ろだけを大文字に変換する場合、次のように実行します。

:%s/error:\zs.*/\U&/

コマンド内訳

  • : コマンドラインモードの開始を意味します。
  • % 範囲指定です。ここでは「全行」が対象になります。
  • s substitute(置換)コマンドです。
  • /192\.168\.[0-9]\+\.[0-9]\+/ 検索パターンです。
    • 192\.168\. … 固定文字列「192.168.」。ピリオドは正規表現では任意の1文字を意味するため、 \. とエスケープして「ドットそのもの」を表現しています。
    • [0-9]\+ … 数字(0〜9)が1回以上連続する部分。
    • \. … ドットそのもの。
    • [0-9]\+ … 再び数字の1回以上連続。 → 全体で「192.168.xxx.xxx」というIPv4アドレスにマッチします。
  • /***.***.X.X/ 置換文字列です。マッチしたアドレスを「..X.X」という形に置き換えます。 これはマスク(匿名化)の例です。
  • /g グローバル置換。1行に複数の 192.168.xxx.xxx があれば全て対象にします。

【出力例:】

error: FILE NOT FOUND
error: ACCESS DENIED
warning: low memory

先読み・後読みの活用パターン

先読み(?=)や後読み(?<=)を使うと、対象の前後に条件を課しながら必要な部分だけ編集できます。

条件自体は消費されないため、より精密な制御が可能です。

対象ファイル: log.txt 内容:

ID=1234 STATUS=OK
ID=5678 STATUS=FAIL
ID=9999 STATUS=OK

「STATUS=」の後ろにある「OK」だけを「SUCCESS」に置換します。

:%s/\(STATUS=\)\zsOK/SUCCESS/g

コマンド内訳

  • : コマンドラインモードの開始を意味します。
  • % 範囲指定で「全行」を対象にします。
  • s substitute(置換)コマンドです。
  • /\(STATUS=\)\zsOK/ 検索パターンです。
    • \(STATUS=\) … 「STATUS=」という文字列にマッチ。カッコで囲んでいますが今回は後方参照はしていません。
    • \zs … マッチの開始位置をここからに変更する特殊指定。これにより「STATUS=」は残しつつ、その後ろの部分だけを置換対象にできます。
    • OK … 「OK」という文字列にマッチ。 → つまり「STATUS=OK」とある部分のうち、「OK」だけを置換対象にします。
  • /SUCCESS/ 置換文字列です。マッチした「OK」を「SUCCESS」に置き換えます。
  • /g 行内に複数あった場合、すべて置換します。

【出力例:】

ID=1234 STATUS=SUCCESS
ID=5678 STATUS=FAIL
ID=9999 STATUS=SUCCESS

パフォーマンスと回避策

ゼロ幅指定や先読み・後読みは非常に便利ですが、複雑な正規表現を大量の行に適用すると処理が重くなることがあります。

特に長大なログや設定ファイルでは実行時間が延び、編集中のレスポンスが悪化する場合もあります。

そのため以下の工夫が効果的です。

ポイント

  • 対象範囲を限定する(例: 10行目から20行目だけに適用)
  • 検索条件をシンプルに保つ
  • 複雑な置換は一度に実行せず、段階的に行う

これらを意識することで、安全かつ効率的にゼロ幅指定や先読み・後読みを活用できるようになります。

複数ファイルと一括処理

開発や運用の現場では、同じ置換処理を複数のファイルに適用するケースが頻繁に発生します。

Vimには一括処理を効率的に進めるための仕組みが用意されており、これを理解しておくことで作業のスピードと正確性が大きく向上します。

正規表現を使った一括置換は非常に便利ですが、誤って実行すると元に戻せない被害を招く恐れがあります。必ず実行前にファイルのバックアップを取ってから操作してください。

:global の活用パターン

:globalは、指定したパターンにマッチする行に対してまとめてコマンドを実行できる仕組みです。

条件に合致した行だけを対象にできるため、大規模な設定ファイルやログファイルを整理する場面で役立ちます。

対象ファイル: config.txt 内容:

server=prd
server=dev
server=prd

config.txt内でprdだけを対象にポート番号を追記する例です。

:g/prd/s/$/:8080/

【出力例:】

server=prd:8080
server=dev
server=prd:8080

:argdo とバッファ横断処理

複数ファイルを横断して一括処理するには :argdo を活用します。

引数リストに登録されたファイルを順番に処理できるため、大量の置換や整形を効率的に行えます。

ここでは実務に沿った2つの方法を紹介します。

ターミナルから複数ファイルを指定する方法

開発環境(dev)をステージング環境(stg)へ切り替えるときのように、複数の設定ファイルをまとめて編集したい場合があります。

ターミナルから対象ファイルを一度に指定すれば、そのまま引数リストに登録され、 :argdo を使って全てのファイルに同じ置換を一括で適用できます。

これにより置換漏れや手作業による入力ミスを防ぎ、安全かつ効率的に環境変更を行うことができます。

ターミナルでファイルを渡すと、そのまま引数リストに登録されます。

対象ファイル:file1.txt

version=dev
name=service-a
endpoint=api.dev.example.com

対象ファイル: file2.txt

version=dev
name=service-b
endpoint=api.dev.example.com

vimから file1.txt と file2.txt を指定して開きます。

vim file1.txt file2.txt

上記コマンドは、最初に指定した file1.txt が編集画面に表示されます。file2.txt も同時に読み込まれていますが、画面には表示されずバッファ内で待機しています。Vim はこの仕組みにより複数のファイルを一度に扱うことができ、:bnext で切り替えたり、:argdo を使って全ファイルに対して一括処理を実行したりできます。

下記のコマンドを実行して「dev」を「stg」へ置換します。

:argdo %s/version=dev/version=stg/ge | update

【出力例:】

"file1.txt" 3L, 58B 書込み
"file2.txt" 3L, 57B 書込み

保存後の file1.txt

version=stg
name=service-a
endpoint=api.dev.example.com

保存後の file2.txt

version=stg
name=service-b
endpoint=api.dev.example.com

Vim 起動後に引数リストを設定する方法

Vimをすでに起動していて、別のファイルを追加でまとめて処理したい場面は少なくありません。

たとえば、設定ファイルの一部を修正している最中に「同じ修正を関連する他の設定ファイルにも適用したい」と気づくときや、ログを調査している途中で「別の日付のログファイルも一緒に置換したい」と思うときです。

このように作業途中で対象ファイルを追加したいときに便利なのが、:args コマンドで引数リストを再設定する方法です。

対象ファイル: file1.txt

version=stg
name=service-a
endpoint=api.dev.example.com

対象ファイル: file2.txt

version=stg
name=service-b
endpoint=api.dev.example.com

2つの対象のファイルを 起動済みVim の引数リスト(バッファ内)に登録します。

:args file1.txt file2.txt

このコマンドは、起動中の Vim に file1.txt と file2.txt を「引数リスト」として登録します。最初に file1.txt が表示され、file2.txt はバッファに読み込まれて待機します。以降はこの引数リストを対象に:argdoを実行すれば、両方のファイルへ一括して置換や保存処理を行えます。

:argdo %s/endpoint=api\.dev\.example\.com/endpoint=api.stg.example.com/ge | update

コマンドの内訳

  • :argdo 引数リストに登録されたすべてのファイルに対して、同じ処理を順番に実行するコマンド。
  • %s/endpoint=api\.dev\.example\.com/endpoint=api.stg.example.com/ge
    • %s は「全行を対象に置換する」指定。
    • endpoint=api\.dev\.example\.com は検索対象の文字列(ドットは正規表現のメタ文字なので \. でエスケープ)。
    • endpoint=api.stg.example.com が置換後の文字列。
    • g フラグは「1行の中に複数あればすべて置換する」。
    • e フラグは「対象が見つからなくてもエラーを出さない」。
  • | Vim で複数のコマンドをつなげるパイプ。
  • update 置換後にファイルを保存する。変更があったときのみ保存が行われる。

【出力例:】

"file1.txt" 3L, 58B 書込み
"file2.txt" 3L, 57B 書込み

保存後の file1.txt

version=stg
name=service-a
endpoint=api.stg.example.com

保存後の file2.txt

version=stg
name=service-b
endpoint=api.stg.example.com

安全な運用とトラブル対策

Vimでの一括置換は非常に効率的ですが、同時に誤操作によるリスクも高まります。思い通りに置換できなかった場合、膨大な修正作業や重要データの破損につながる可能性があります。

ここでは、安心して運用するための検証方法や復旧手順を紹介します。

置換前検証とドライラン手順

本番置換の前に必ず想定通りの結果になるかを確認することで、不要なトラブルを避けられます。

Vimには件数だけを確認できる「ドライラン」があるため、実行前に全体像を把握できます。

対象ファイル: file1.txt, file2.txt

file1.txt

A=dev
B=dev
C=prod

file2.txt

X=dev
Y=prod
Z=dev

まずは 対象2ファイルを開きます。

vim file1.txt file2.txt

これらのファイルを対象に、置換の発生件数を確認します。

:argdo %s/dev/stg/gn

コマンドの内訳

  • :argdo 現在の引数リストに含まれるすべてのファイルを順番に対象にするコマンドです。
  • %s ファイル全体(% が全範囲を示す)を対象に置換を実行します。
  • dev 置換の検索対象となる文字列です。ここでは「dev」という文字列を探します。
  • stg 置換後の文字列です。検索対象「dev」を「stg」に置き換える指定です。
  • g 行内に複数マッチがあった場合、すべてを対象にするフラグです。
  • n 実際には置換をせず、件数のみを表示するフラグです。

このコマンドは実際には置換を行わず、件数のみを表示します。これにより、想定外の行数が変更されないか事前に把握できます。

【出力例:】

2 箇所該当しました (計 2 行内)
"file2.txt" 3 行, 19 bytes
2 箇所該当しました (計 2 行内)

この出力の意味は以下の通りです。

出力メッセージ対象ファイルと行ヒット箇所確認内容
1 箇所該当しました (計 1 行内)file1.txt の 1 行目A=devA の値が対象になっているか確認
1 箇所該当しました (計 1 行内)file1.txt の 2 行目B=devB の値が対象になっているか確認
1 箇所該当しました (計 1 行内)file2.txt の 1 行目X=devX の値が対象になっているか確認
1 箇所該当しました (計 1 行内)file2.txt の 3 行目Z=devZ の値が対象になっているか確認

この結果から「どの行に何件マッチしているか」を把握できます。

ポイント

  • 「2 箇所該当しました (計 2 行内)」  
    直前に処理したファイル(file1.txt)で、dev が 2 行に存在しており、それぞれ 1 件ずつマッチしたという意味。 
    具体的には file1.txt の 下記がヒットしている。 
    • 1 行目 A=dev  
    • 2 行目 B=dev 
  • 「"file2.txt" 3 行, 19 bytes」  
    次に処理対象となるファイルが file2.txt であることを知らせている。  
    このファイルは 3 行構成で全体サイズが 19 バイトであることを示すメタ情報。
  • 「2 箇所該当しました (計 2 行内)」  
    file2.txt においても dev が 2 行に存在し、それぞれ 1 件ずつマッチしたという意味。  
    具体的には file2.txt の 下記がヒットしている。
    •  1 行目 X=dev  
    •  3 行目 Z=dev 

このようにfile1.txt と file2.txt を合わせて4箇所の dev がヒットしたという意味です。

そして重要なのは、ここで出力された件数確認はシミュレーションであり、まだファイル自体は一切変更されていないことです。 つまり出力件数から、どの行に dev が存在して、置換対象になるのかを安全に検証することができます。

このステップで想定通りのマッチ数かを確認することが、安全運用の肝になります。また、大量のファイルや行に対して一括置換を行う場合、:argdo %s/dev/stg/gn の出力だけで正確に把握するのは困難です。

表示されるのは「1行で◯件マッチ」といった件数情報に限られるため、暗算で合計を突き合わせる方法では漏れや誤認のリスクが高くなります。

確認方法特徴
件数ベースの確認置換対象件数を事前に想定し、合計件数が一致するか照合する
検索のみの確認:vimgrep /dev/ *.txt を実行し、対象行を直接一覧表示して件数と内容を同時に確認する
外部ツールとの併用grep -R dev . を使い、Vimの出力と突き合わせて照合する

このように「小規模な場合は :argdo … gn で件数確認」「大規模な場合は検索コマンドや外部ツールで一覧確認」と使い分けることで、想定外の置換を防ぎ安全に作業できます。

まとめと次のステップ

ここまで、Vimで複数ファイルを対象に置換や検証を行う方法を解説しました。

特に「:argdo」コマンドは小規模な置換確認には有効であり、誤操作を防ぐ手段として有用です。

ただし、大規模ファイル群では確認が困難になるため、その限界を理解しておくことが重要です。

習得後に広がる活用領域

今回の知識を習得すると、複数の設定ファイルを一括で修正したり、ログやソースコードの特定部分を効率的に置換する作業が可能になります。

これにより、手作業の繰り返しによるミスを防ぎつつ、運用や開発のスピードを大幅に高めることができます。

関連記事と学習ロードマップ

次の学習ステップとしては、Vimのマクロ機能や正規表現の応用、さらに外部コマンドとの連携を習得すると実務での活用度が高まります。

関連記事ではマクロの自動化や外部コマンド連携を解説しており、今回学んだ複数ファイル処理と組み合わせれば、より高度な作業効率化を実現できます。

次のおすすめ記事

実践環境を整える

ここまで学んだ知識を実際に試すには、Linuxを動かす環境が必要です。手軽に始めるならVPSを利用するのがおすすめです。
VPS徹底比較!ConoHa・さくら・Xserverの選び方



VPSを利用してLinux環境を準備したら、実際の設定は下記の記事が参考になります。
VPSに開発環境を自動構築する方法|Apache+Tomcat+PostgreSQL

よく読まれている記事

1

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか? 無料で使えるだけでなく、高い柔軟 ...

2

Linux環境でよく目にする「Vim」という名前。サーバーにログインしたら突然Vimが開いてしまい、「どうやって入力するの?」「保存や終了ができない!」と困った経験をした人も多いのではないでしょうか。 ...

3

ネットワーク技術は現代のITインフラにおいて不可欠な要素となっています。しかし、ネットワークを深く理解するためには、その基本となる「プロトコル」と「レイヤ」の概念をしっかり把握することが重要です。 こ ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

5

Javaは世界中で広く使われているプログラミング言語であり、特に業務システムやWebアプリケーションの開発において欠かせない存在です。本記事では、初心者向けにJavaの基礎知識を網羅し、環境構築から基 ...

-Vimの基礎知識