Sublime Text 无真正全局去重保序功能:Remove Duplicate Lines 仅删相邻重复,Sort Lines: Unique 会打乱顺序;保序去重需正则或外部命令,且须统一换行符、清除尾部空白等预处理。

Sublime Text 没有真正意义上的“全局去重并保序”功能。你看到的 Remove Duplicate Lines 只删相邻重复;Sort Lines: Unique 会打乱原始顺序;想保留首次出现位置、只删后续重复,必须用正则或外部命令。
为什么 Remove Duplicate Lines 总是删不干净
它底层就是逐行比对上一行是否完全一致,不建哈希表、不缓存历史、不扫描全文。比如这三行:
apple
banana
apple
第二个 apple 不会被删——因为它的上一行是 banana,不是 apple。
常见失效场景包括:
- 行尾多一个空格或 Tab,就被视为不同行
- 文件含 BOM 或混合换行符(
\r\n和\n并存),判重直接失败 - 存在零宽字符(
\u200B)时,肉眼不可见但匹配中断 - 未全选文本时,只作用于当前光标所在段落,不是全文
- 空行会切断匹配链,导致后续重复漏判
Sort Lines: Unique 看似省事,但顺序一乱就不可逆
这个命令本质是先字典序排序,再合并相邻重复行。结果是:
- 原始顺序彻底丢失:日志时间线、代码执行顺序、CSV 表头位置全被重排
- 保留的是排序后每组中的首行,不一定是原文中第一次出现的那行(例如
Apple和apple共存时,Apple可能被留,apple被删) - 数字字符串如
log2.txt和log10.txt会按 ASCII 排(log10排在log2前),非自然序 - 若文件含混合换行符,排序结果错位,后续去重语义失效
快捷键需手动绑定:{"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,该切系统命令就切
超过 5 万行时,Sublime 的正则和排序会明显卡顿,内存占用飙升,且不可中断。实测 10 万行平均长度 200 字符的纯文本,排序耗时 3–6 秒(i7-10875H)。
更稳妥的做法是交给系统命令:
- Linux/macOS:
sort -u file.txt - Windows PowerShell:
Get-Content file.txt | Sort-Object -Unique - Python 一行脚本:
python3 -c "print(''.join(sorted(set(open('file.txt').readlines()), key=lambda x: open('file.txt').readlines().index(x))))"(仅小文件)
真正容易被忽略的,不是“怎么删”,而是“什么是重复”:是整行?某几列?是否忽略空格或大小写?没想清这点,换十个插件也白搭。

















