sublime text原生正则可清洗sql dump,关键在锚定行边界(用\z兜底末行)、正确处理crlf换行、删注释用--.*$、提取values值需平衡括号匹配,且必须先确认文件编码为utf-8。

Sublime Text 原生正则替换完全能胜任数据库备份文件(如 SQL dump)的清洗任务,无需插件、不依赖外部工具,关键在于避开换行符陷阱、正确处理引号嵌套和语义边界——多数“失败”其实是因为^、$没锚定到每行,或.没匹配换行。
SQL dump 中删注释和空行为什么总漏掉最后一行?
因为备份文件末尾常无换行符,^\s*$在默认模式下匹配不到最后一行的“空行”;同时 Windows 的 \r\n 会让 ^ 和 $ 失效。
- 先点击右下角换行标识,强制切换为 Unix (LF) 格式(哪怕原文件是 CRLF)
- 查找:
^\s*$\Z(\Z匹配文件结尾,兜底最后一行) - 替换留空;再补一次查找:
\s*\Z,替换为空,清理末尾残留空白 - 删 SQL 注释:用
--.*$(启用.*模式),不是//—— MySQL 注释是双横线
从 INSERT INTO ... VALUES (...) 提取字段值但不跨括号
直接用 VALUES \(([^)]+)\) 会卡在含逗号的字符串里(如 'a,b', 123),而 VALUES \(([\s\S]*?)\) 又可能吞掉后续语句。
- 安全做法:先删掉所有
INSERT INTO行头,只留VALUES部分 → 查找:^INSERT INTO [^;]+;\n?,替换为空 - 再匹配单组值:用
VALUES \(([^()]*(?:\([^()]*\)[^()]*)*)\)(非递归平衡括号,Sublime 的 Pythonre引擎支持) - 替换为:
$1,然后按Alt+Enter全选 →Ctrl+Shift+P→Copy Selected Text导出 - 注意:若字段含转义单引号(
'O''Reilly'),此正则仍有效;但含嵌套括号(如函数调用)需人工复查
批量修复乱码字段(如 UTF-8 字符被当 GBK 解码成 )
这不是正则能修的,是文件编码错位导致的字节错读——正则在错误编码下匹配的是乱码字节,越替越糊。
- 右下角看当前
Encoding:若显示Western (CP1252)或GBK,但原始 dump 是 UTF-8(尤其含中文/emoji),必须先转码 - 操作:
File → Reopen with Encoding → UTF-8(有 BOM 选UTF-8 with BOM) - 转完再查中文字段:
title = '([^']+)',别用.*?—— 容易跨到下一个' - 如果已误操作且保存过,用
git checkout -- file.sql回退,比重解码更可靠
跨文件批量改表名或库名时为什么只改了部分文件?
Ctrl+H 的“全部替换”只作用于当前文件;真要改整个备份目录,必须用 Ctrl+Shift+F(Find in Files),且路径过滤要精确。
- 打开
Ctrl+Shift+F,勾选右下角.* - Where 栏填:
./dump_202608/*.sql(别用**,Sublime 不支持 glob 递归) - 查找:
myapp_users,替换为:prod_users;务必先点Find看命中列表,确认没误伤myapp_users_backup - 替换后不会自动保存,执行
Ctrl+K → Ctrl+B(Save All)或手动逐个保存 - 高危操作前,先
git init && git add . && git commit -m "before-sql-rename",比任何预览都准
最复杂的地方不在正则多难写,而在于 SQL 本身不是正则友好格式:括号嵌套、字符串转义、注释位置多变。每次清洗前,先用 Ctrl+Shift+F 找出 3–5 个典型样本,手工验证正则是否真正覆盖所有变体——自动化省时间,但上下文判断不能跳过。











