Sublime Text批量处理多行SQL事务需调对三点:启用(?s)使.匹配换行符、(?m)使^$按行锚定、分号需转义;否则正则无效。

Sublime Text 能批量处理多行 SQL 事务语句,但默认正则不跨行、^和$不按行匹配、.不吃换行符——这三个点没调对,所有正则都白写。
多行 SQL 事务(如 BEGIN…COMMIT)为什么搜不到
事务语句通常跨多行,比如:
BEGIN TRANSACTION;
UPDATE users SET status = 'active' WHERE id = 1;
INSERT INTO logs (msg) VALUES ('user activated');
COMMIT;
直接写BEGIN.*?COMMIT找不到,因为.默认不匹配换行符;写^BEGIN.*?COMMIT$也失败,因为^/$默认只锚定全文首尾,不是每行。
- 必须加
(?s)启用单行模式:让.能匹配换行符,例如(?s)BEGIN.*?COMMIT; - 若想更精准控制“行首开始”,再叠加
(?m):写成(?sm)^BEGIN.*?COMMIT;$ - 结尾分号
;要转义,否则可能被当作正则元字符解析 - 用
.*?(非贪婪)而非.*,避免从第一个BEGIN吃到文件末尾最后一个COMMIT
替换时怎么保留内部结构,只改事务外壳
常见需求是把BEGIN TRANSACTION;→START TRANSACTION;,同时保留中间所有 SQL 不动。不能靠全量替换,得用捕获组。
- 查找:
(?sm)^BEGIN\s+TRANSACTION;$\n((?:[^B]|B(?!EGIN))*?)^\s*COMMIT;$(较重,适合小范围) - 更稳做法:分两步——先用
(?sm)^BEGIN\s+TRANSACTION;$替成START TRANSACTION;,再单独处理COMMIT行 - 如果事务里有嵌套
BEGIN(少见但存在),正则无法可靠识别,此时应人工圈选或改用脚本工具 - 替换框中用
$1引用捕获内容,注意:查找里是\1,替换里必须是$1,写成\1会原样输出
跨文件批量改 SQL 迁移脚本时路径和范围怎么设
Ctrl+H只改当前文件;事务语句常分散在/migrations/或/sql/目录下多个文件中,必须用Ctrl+Shift+F(Find in Files)。
- Where 框填路径,统一用正斜杠:
./migrations/**/*.sql或./sql/*.sql - 路径不支持 Windows 风格反斜杠
\,也不接受通配符**\*.sql(反斜杠会被当字面量) - 务必先点
Find预览匹配数量——如果只高亮 0 处,八成是路径错、正则没开.*、或文件编码不一致(如含 BOM) - 替换后不会自动保存,需手动按
Ctrl+K→Ctrl+B(Save All)或逐个文件Ctrl+S
替换后光标消失、缩进错乱、中文乱码怎么防
执行Replace All后光标全丢、列对齐崩掉、甚至中文变方块,不是 bug,是 Sublime 默认行为和设置未调优。
- 光标丢失:在用户设置(
Preferences → Settings – User)加"swap_selection_on_replace": false,替换后光标仍保留在各处 - 缩进错乱:避免用
Ctrl+Shift+L后直接输内容;先列选(Shift+Alt垂直拖)再输入,或统一用Home跳到行首 - 中文乱码:确保文件编码为 UTF-8(右下角状态栏查看),若显示
UTF-8 with BOM,先用File → Reopen with Encoding → UTF-8重载 - 大文件卡死:关闭
Highlight matches(菜单 → Find → Highlight matches),或先Find All复制匹配行到新窗口再操作
最易忽略的是:事务语句里可能混着注释、模板变量(如{{ table_name }})、或 JSON 字符串中的BEGIN字面量——正则不区分上下文,一替全替。真要安全,得先临时注释掉非 SQL 区域,或用Ctrl+Shift+P→Toggle Comment隔离代码块再操作。

















