Sublime Text无原生去重功能,需依赖插件或“排序+正则”两步法:先Sort Lines使重复行相邻,再用^(.*)$(\n\1)+$匹配并删除后续重复行。

Sublime Text 里没有原生“去重”功能,得靠插件或正则组合
Sublime Text 默认不提供“删除重复行”按钮,Remove Duplicates 这类操作必须依赖插件或手动构造正则。直接选中所有行按 Ctrl+Shift+P 搜“duplicate”,大概率什么也找不到——因为没装对应插件。
常见错误现象:Find → Find in Files 里输 ^(.*)(\n\1)+$ 想一键删重复,结果啥也没匹配上:这是正则方向反了,它匹配的是“连续重复行”,不是“全文去重”。
- 真正可用的路径只有两条:装插件(推荐
Text Pastry或Advanced CSV配合排序),或者用正则 + 排序两步走 - 如果文本带空行或首尾空格,
^\s*$和^\s*(.*?)\s*$的差异会直接影响去重结果 - 大文件(>5MB)用正则去重容易卡死,这时候插件底层调用 Python 的
set()更稳
用 Sort Lines + 正则两步法手动去重(不装插件也能做)
这是最可控、兼容性最好的方案,适用于 Sublime Text 3/4 所有版本,不需要额外依赖。
使用场景:临时处理日志、配置项列表、SQL 插入值等结构松散但行粒度清晰的文本。
- 先全选 →
Ctrl+Shift+P→ 输入Sort Lines→ 回车(确保重复行被挤在一起) - 再按
Ctrl+H打开替换面板,勾选Regular Expression(.*图标) - 查找框填:
^(.*)(\n\1)+$,替换框留空 - 点
Replace All—— 注意:这个正则只删“后面紧跟着的重复”,所以必须先排序
参数差异:\1 是捕获组,+ 表示“一个或多个重复”,$ 锁定行尾;漏掉 $ 可能误删部分匹配内容。
装插件后怎么避免“去重把顺序搞乱”
很多用户装了 Remove Duplicates 插件,一运行发现原本按时间排的日志全乱了——插件默认是“保留首次出现”,但内部实现其实是先转成 set 再转回 list,丢失原始顺序。
性能影响:对 10 万行以内文本,Remove Duplicates 插件和手写 Python 脚本耗时接近;但超过 20 万行,用 Sublime 自带的 Sort Lines + 正则反而更快(C++ 实现)。
- 想保序?别用插件一键去重,改用
Ctrl+Shift+P→Permute Lines: Unique(需装Permute Lines插件) - 如果文本含制表符或不可见字符,插件可能把
abc和abc\t当作不同行,得先统一清理:用\t替换为,再跑去重 - 某些插件(如
Advanced CSV)在 CSV 模式下会自动忽略引号内换行,此时去重逻辑会失效
为什么正则 ^(.*)$([\s\S]*?)^\1$ 在 Sublime 里根本不能用
这个写法在在线正则测试站能跑通,但在 Sublime 里点 Replace All 直接没反应——根本原因是 Sublime 的正则引擎不支持跨行捕获([\s\S] 在多行模式下仍受限于行边界)。
错误现象:Find All 显示匹配 0 处,但肉眼明显有重复行;或者只删掉第一对,后面不动。
- Sublime 使用的是 Boost.Regex 引擎,
^和$默认只认单行首尾,不认整个文档首尾 - 哪怕开了
dot matches newline,[\s\S]也无法跨越\n捕获到后续行的^\1 - 正确替代思路:放弃“一步跨行匹配”,老实用排序 + 相邻重复正则,稳定且可预期
复杂点在于:去重不是纯算法问题,而是和文本格式、Sublime 引擎特性、用户预期顺序强耦合。没理清这三者关系,装再多插件也只是反复试错。










