Sublime Text 无原生保序去重功能:Remove Duplicate Lines 仅比对相邻行,Sort Lines: Unique 会排序打乱顺序;正则 ^(.*$)\n(?=.*^\1$) 需预处理换行符和空白;大文件推荐 Filter Lines 插件。

Sublime Text 没有真正“删掉全文重复行并保留原始顺序”的原生命令。你用 Remove Duplicate Lines 删不干净,用 Sort Lines: Unique 又会打乱日志时间线、代码声明顺序或配置项位置——这不是功能弱,是设计意图根本不同。
为什么 Remove Duplicate Lines 总是漏删重复行
它只比对当前行和上一行是否完全一致,不建哈希表、不扫描全文、不跳过空行。比如这三行:
apple banana apple
第二个 apple 不会被删,因为它的上一行是 banana,不是 apple。
- 行尾多一个空格、Tab 或零宽字符(
\u200B),就判为不同行 - 文件混用
\r\n和\n,换行边界错位,匹配直接失效 - 未全选文本时,它只作用于光标所在段落,不是全文
- 大小写不一致(
Apple和apple)视为两行
Sort Lines: Unique 为什么会乱序且保留错的行
它本质是先字典序排序,再合并相邻重复,等价于 sort | uniq。所以 zebra 一定排在 apple 前面,不管原文谁先出现。
- 保留的是排序后每组里的第一行,不是原文中第一次出现的那行(例如
Apple和apple共存时,Apple可能被留,apple被删) - 数字字符串如
log2.txt和log10.txt按 ASCII 排(log10在log2前),非自然序 - 若文件编码非 UTF-8(如 GBK),可能触发
UnicodeDecodeError - 快捷键必须手动配置:
{"keys": ["ctrl+alt+u"], "command": "sort_lines", "args": {"unique": true}}
真要保序去重,正则 ^(.*$)\n(?=.*^\1$) 怎么用才不翻车
这个正则能精准匹配「后面还有相同行」的所有重复行(除第一个),但非常依赖预处理。
- 必须先统一换行符:菜单
File → Line Endings → Unix,否则^和$在\r\n下错位 - 查找面板中务必勾选
Regular Expression和Whole Line;若文本含多行内容,还要点右下角.*启用. matches newline - 输入
^(.*$)\n(?=.*^\1$)后,先点Find All,再按Ctrl+Shift+L转多光标,最后按Delete——首行自动跳过 - 仍有残留?说明存在尾部空白干扰,先执行
Find → Replace,查找\s+$,替换为空,再跑正则 - 大文件(>5 万行)慎用:Sublime 内存占用陡增、响应卡顿,实测 10 万行可能卡死数秒
大文件或高频使用时,插件比正则更稳
正则在超长行、嵌套换行符或混合编码下容易匹配失败,而插件底层调用 Python 的 set() 或更健壮的文本解析逻辑。
-
Filter Lines插件(Package Control 可装)提供Filter Lines: Unique命令,行为等价于awk '!seen[$0]++',保序、支持大文件、可中断 -
Advanced CSV适合处理带引号、逗号嵌套的 CSV,支持按列去重,不会误伤字段内内容 - 别装一堆同名插件:很多叫
Remove Duplicate Lines的插件,底层仍是逐行比对上一行,和内置命令一样不可靠
真正难的从来不是“怎么删”,而是“什么是重复”:是整行?某几列?是否忽略空格、大小写、BOM 或零宽字符?没定义清楚这点,换十个方法都白搭。

















