Sublime中^\s*key:\s*.*$匹配不到配置项,根本原因是编码(如UTF-8 with BOM)和换行符(如CRLF)不统一导致^/$失效;须先转为UTF-8编码+Unix换行,再用正则才稳定命中。

为什么^\s*key:\s*.*$匹配不到你的配置项
常见现象是写好正则 ^\s*host:\s*.*$ 却“Find All”零结果,尤其在 YAML/INI 类配置里。根本原因不是正则写错,而是 Sublime 默认不把 \s 当作换行符处理,且配置文件常混用空格、制表符、BOM 头——状态栏显示编码若为 UTF-8 with BOM 或 GBK,^ 和 $ 就可能失效。
必须先统一动作:
- 执行
File → Reopen with Encoding → UTF-8(不是 “UTF-8 with BOM”) - 再执行
File → Line Endings → Unix(强制统一为\n) - 确认右下角状态栏显示
UTF-8和Unix,再输正则
此时 ^\s*host:\s*.*$ 才能稳定命中整行,包括前面缩进 2 空格或 1 个 tab 的情况。
合并多段同名配置项(如多个 include:)
想把分散在不同位置的 include: xxx.yml 行全部抽出来、拼成一行逗号分隔,不能靠 Ctrl+J——它只合并相邻选中行,对跨段落无效。
正确流程是两步正则:
- 第一步:用
^\s*include:\s*(.+)$+Find All→Ctrl+L(扩展为整行选中)→Ctrl+C - 第二步:新建空白文件,粘贴;再打开替换面板,
Find填\r?\n,Replace填,,点Replace All
注意:Find All 后务必按 Ctrl+L,否则只复制匹配文本(即 xxx.yml),丢掉 include: 前缀;而直接 Ctrl+A → Ctrl+C 会带入原始缩进和空行,污染结果。
join_lines 在配置合并中为何总是少一行或多空格
join_lines(快捷键 Ctrl+J)本质是「删换行+加空格」,但配置项常含注释、空行、末尾空格,导致结果不可控:
- 选区没覆盖到最后一行的换行符(即光标没落在下一行开头),最后一行被漏掉
- 某行末尾有空格,
Ctrl+J会在它后面再加一个空格,变成key: value→key: value next_key: - 遇到
# comment行,Ctrl+J会把它和上一行硬拼,破坏语义
结论:处理配置项时,join_lines 只适用于已人工清理过、纯 key-value 且无注释的连续几行;批量、跨段、含注释的场景,必须用正则提取+替换,绕不开。
避免合并后 YAML 格式崩坏的关键细节
YAML 对缩进和冒号后空格极其敏感。合并 paths: 下的列表项时,若直接把 - /a、- /b 拼成 - /a - /b,就完全非法。
安全做法是用捕获组重写结构:
- 查找:
^\s*-\s*(.+)$ - 替换:
$1 - 再对结果做一次
\r?\n→,替换
这样就把 - /a 提纯为 /a,再拼成 /a, /b,可直接塞回 paths: [ /a, /b ]。记住:所有涉及 YAML 列表/嵌套的合并,第一步永远是「剥离语法符号,只留值」,否则格式必然出错。


















