Sublime Text 无真正保序去重功能:Remove Duplicate Lines 仅删相邻重复,Sort Lines: Unique 会打乱顺序;需用正则 ^(.*$)\n(?=.*^\1$) 或系统命令(如 awk '!seen[$0]++')实现保序去重。

Sublime Text 没有真正意义上的“一键全局去重并保序”功能。你看到的 Remove Duplicate Lines 只删相邻重复;Sort Lines: Unique 会彻底打乱原始顺序;想保留第一处出现的位置、只删后面重复的,必须用正则或外部命令。
为什么 Remove Duplicate Lines 总是删不干净?
它底层就是逐行比对上一行是否完全一致,不建哈希表、不缓存历史、不扫描全文。比如这三行:
apple banana apple
第二个 apple 不会被删——因为它的上一行是 banana,不是 apple。
- 对空格、Tab、BOM、零宽字符(
\u200B)、混合换行符(\r\n和\n并存)极度敏感:"hello"和"hello "被视为不同行 - 不支持忽略大小写:
Apple和apple不会合并 - 未全选时,只作用于当前光标所在段落,不是全文
- 空行也会中断匹配链,导致后续重复漏判
Sort Lines: Unique 为什么不能直接用?
它是 Sublime Text 4.4+ 新增命令,本质是先执行字典序排序,再合并相邻重复行。结果是:顺序必然丢失,且保留的是排序后每组中的首行,不一定是原文中第一次出现的那行。
- 若文件含
Apple和apple,排序后Apple可能排在前面并被保留,apple被删 - 混合换行符会导致排序错位,
sort -u级别的语义失效 - 数字字符串如
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下会错位 - 打开查找面板(
Ctrl+F),勾选 Regular Expression 和 Whole Line;若文本含多行内容,还要点右下角.*启用 . matches newline - 输入
^(.*$)\n(?=.*^\1$),点 Find All,再按Ctrl+Shift+L转多光标,最后按Delete—— 首行自动跳过 - 如果仍有残留,说明存在尾部空白干扰,先执行
Find → Replace,查找\s+$,替换为空,再跑正则
大文件或高频处理,别硬扛 Sublime
超过 5 万行时,Sublime 的正则和排序会明显卡顿,内存占用飙升,且不可中断。这时候甩给系统命令更稳:
- Linux/macOS:
sort -u file.txt(排序去重)或awk '!seen[$0]++' file.txt(保序去重) - Windows PowerShell:
Get-Content file.txt | Sort-Object -Unique(排序去重),或Get-Content file.txt | ForEach-Object {$seen{$_.Trim()}++ -eq 1} | Set-Content out.txt(保序) - Python 一行脚本(跨平台):
python3 -c "import sys; seen=set(); [print(l.strip()) for l in sys.stdin if l.strip() not in seen and not seen.add(l.strip())]"
正则里 ^ 和 $ 的行为、换行符统一、尾部空白、零宽字符——这些细节不处理,^(.*$)\n(?=.*^\1$) 就只是个看起来很美的表达式。

















