应使用^s$\n^\s*$匹配空行块并替换为--- ,而非直接用^s$替换,否则会破坏段落结构、混淆合法/多余空行、违反代码规范;末尾空行需用Ctrl+Shift+K删除并补换行符。

不能直接用正则把空行替成特定字符——那会破坏段落结构,且 Sublime 的 ^s*$ 匹配的是整行,替换后该位置变成一个带字符的“非空行”,语义就变了。 真正安全的做法是:先识别空行块,再用捕获组控制替换逻辑,把「连续空行」压缩为「一个含指定字符的行」。
为什么 ^s*$ 替换为 ### 会出问题
这种写法看似简单,但实际踩中三个底层机制:
-
^s*$每次只匹配单个空行,Replace All 会把每个空行都替成###,结果满屏###,不是你想要的“分隔符” - 它无法区分「段落间合法空行」和「多余空行」,Markdown 标题下压掉空行会导致渲染失败
- Python 文件里
def后必须有且仅有一个空行,多插或少插都会触发 linter 报警或IndentationError
正确做法:用 ^s*$
^s*$ 匹配空行块,再替换为带字符的单行
目标是把两个及以上连续空行(含伪空行)压缩成一行含指定字符的内容,比如 --- 或 /* --- */:
- 查找内容填:
^s*$ ^s*$ - 替换为:
---(注意末尾保留,否则下一行会粘上来) - 务必关闭右下角的
. matches newline(即不点亮 ↩ 图标) - 点
Replace All,再点一次,直到Find All显示 0 个匹配
这个写法能稳定捕获相邻空行对,不会跨行误吞,也兼容 Windows 的
。如果原文有三连空行
,第一次变
,第二次才压成 ---
——这是 Sublime 替换引擎的线性扫描特性,不是 bug。
想保留原空行数、只在其中插入字符?用列编辑更可控
某些场景(如日志分隔、YAML 注释区)需要“在原有空行位置加字符”,而不是替换整行。这时别碰正则,改用列选:
- 先用
Ctrl+F搜^s*$,勾选正则,按Enter高亮所有空行 - 按
Ctrl+Enter全部选中,再按Ctrl+Shift+L拆成每行一个光标 - 按
Home移到行首,输入你要的字符(如//),所有光标同步输入 - 注意:空行本身不含换行符结尾,光标默认停在行首,输入后自动顶格,不会缩进错乱
这种方式不改变空行数量,只在其上叠加内容,适合配置文件头注释、SQL 脚本分段标记等需保留格式语义的场景。
末尾空行 + 特定字符 = 最容易翻车的组合
文件末尾若存在无换行符的空行(EOF 前光标停在空行),^s*$ 根本匹配不到它;而你手动输的 --- 又没换行,Git 会报 no newline at end of file。
补救步骤必须严格按顺序:
- 先执行上面的空行块压缩,确保中间空行已处理
- 按
Ctrl+End到文件末尾,看状态栏是否显示Ln X, Col Y—— 如果Col不是 1,说明末尾空行没换行符 - 此时不要按
Delete或Backspace,而是按Ctrl+Shift+K(删整行),它会干净删除并补上换行符 - 最后再在倒数第二行插入你的分隔符,比如在最后一行前插入
---
真正容易被忽略的是:Sublime 不校验语法,也不提示你「这个 --- 正好插在 Python 的 docstring 里」。压完之后,得人工扫一眼关键分隔处,或者用 Ctrl+F 搜
---
确认是否有多余嵌套。

















