需將 SQL 腳本中大量 INSERT 語句的自增 ID 依指定起始值 (如 151) 重新編號。Vim 強大的 :global + :substitute + 表達式暫存器 (\=) 可單指令完成。本文詳細拆解指令結構、提供通用模板與 Perl 替代方案。

-- online.sql 原始內容
insert into ct values(1, 'sss', 2, 4);
insert into ct values(1, 'sss', 2, 4);
insert into ct values(1, 'sss', 2, 4);
...
-- 目標: 將第一個值 1 依序改為 151, 152, 153...
:let n=151 | g/values(\zs\d\+/s//\=n/ | let n+=1
| 片段 | 功能 | 說明 |
|---|---|---|
let n=151 |
初始化變數 n = 151 | :help let |
| |
指令分隔符 | :help :bar |
g/pattern/ |
全域搜尋符合 pattern 的行並執行後續 ex 指令 | :help :g |
values(\zs\d\+ |
搜尋模式:values( 後的數字 (\\zs 設定匹配起點) |
:help /\zs |
s//\=n/ |
替換匹配部分為變數 n 的值 (\\= 表達式暫存器) | :help :s\= |
| let n+=1 |
變數 n 遞增 1 | 下一行匹配時使用新值 |
values(1 → 替換為 151 → n = 152values(1 → 替換為 152 → n = 153insert into ct values(151, 'sss', 2, 4);
insert into ct values(152, 'sss', 2, 4);
insert into ct values(153, 'sss', 2, 4);
...
# 當前目錄及子目錄所有 pom.xml 中的 Maven 中央倉庫 URL 導向內部 Nexus
find -name 'pom.xml' | xargs perl -pi -e 's|https://repo1.maven.org/maven2|https://localhost:8081/nexus/content/groups/public|g'
# 遞迴替換 HTML 關鍵字
find . -type f -name '*.html' | xargs perl -pi -e 's|old_text|new_text|g'
# 僅列出包含 log 關鍵字的目錄
find ./ -name '*log*' -type d
" 1. 進入視覺行模式 V,選取行範圍
" 2. 輸入 : 進入命令列 (自動帶入 '<,'>)
:'<,'>s/old/new/g
" 或指定行號範圍
:10,31s/old/new/g
" 顯示行號輔助定位
:set number
:set nonumber
\zs/\ze 設定匹配範圍邊界,避免替換到前綴\= 後可接任意 Vim Script 表達式 (函數呼叫、運算、條件判斷)submatch(n) 取得第 n 個捕獲組內容掌握 :g/pattern/s//\=expr/ 模式,即可在 Vim 內以程式化方式處理複雜的結構化文字批次修改,效率遠超外部腳本。