最稳、最通用的删空行方法是用 ^\s*$ 正则替换为空,它能精准匹配真正空行及含空格、Tab、全角空格、零宽空格等伪空行,兼容LF/CRLF换行,无需插件且不依赖“. matches newline”选项。

直接结论:用 ^\s*$ 正则替换为空,是最稳、最通用的删空行方法;别信“一键插件”,DeleteBlankLines 之类只认真正空行,对带空格、Tab、零宽空格的“伪空行”完全失效。
为什么 ^\s*$ 比 ^$ 和 \n\n 都可靠
很多人试过 ^$,发现一堆“看着空”的行没被删——因为那行其实有空格或 Tab;也有人直接替换 \n\n,结果把函数间的合理空行全干掉了,还可能破坏文件末尾换行符。而 ^\s*$ 的行为是:从行首开始,匹配零个或多个空白字符(含空格、\t、\r、\n),直到行尾。它天然兼容 LF 和 CRLF,不依赖换行符类型,也不需要开启 . matches newline。
-
^\s*$能命中“伪空行”,比如粘贴自网页的(全角空格)或\u200b(零宽空格)开头的行 - 必须关闭右下角的
. matches newline,否则^和$会失效,整段被误吞 - 替换框务必留空,填
\n或空格反而会多塞内容,导致空行翻倍 - 这个正则在文件末尾无换行符时仍能匹配最后一行(如果它是空的),比
^\s*$\n更鲁棒
删完还有残留?重点盯这几个边界
删完发现末尾还剩一两行“空”,不是正则写错了,是 Sublime 对 EOF 前空行的处理逻辑所致:^\s*$ 匹配的是“有换行符锚定的行”,而文件结尾若为 \n\n,它能删掉倒数第二行,但最后一行(EOF 前)可能逃逸。
- 补救方法很简单:光标移到最后一行开头,按
Ctrl+Shift+K(Windows/Linux)或Cmd+Shift+K(macOS),它会干净删除整行及关联换行符 - 别用
Delete或Backspace—— 它们只删字符,容易留下“视觉空行”却没换行符,Git 会报 “no newline at end of file” - 如果文件是 UTF-8 with BOM,BOM 字节
\ufeff可能干扰匹配;临时转成 UTF-8 without BOM,或改用显式写法:^[ \t\r\n\uFEFF\u200b\u00a0\u3000]*$
想批量处理多文件?别用 “Replace All in Files”
在 Find in Files 里对 ^\s*$ 执行 “Replace All in Files”,Sublime 实际只是把匹配行替换成空字符串,**并不删除其换行符本身**。结果是空行变成“长度为 0 的行”,界面看起来还是空的,文件体积不变,下次再搜还会命中——等于白干。
- 真正安全的做法是分步:先
Find All看匹配数,超 5000 行就别全量操作 - 选中一段(如一个函数块或配置节),勾选
In Selection再替换,可控性高 - 项目级清理建议用 Build System 预处理,比如 macOS 上建
TrimEmptyLines.sublime-build,内容为:{ "shell_cmd":"sed -i '' '/^[[:space:]]*$/d' $file", "selector":"source" }注意 Linux 去掉-i ''中间的两个单引号,Windows 用户需改用 PowerShell 脚本
真正难的从来不是写对正则,而是判断哪一行“该删”——空行是否承担了段落分隔语义?末尾要不要保留换行符?这些没法交给工具自动决定,得人来拍板。正则只是执行者,不是裁判。

















