Sublime Text 无真正保序去重原生命令:Remove Duplicate Lines 仅删相邻重复,Sort Lines: Unique 会排序打乱顺序;需用正则 ^(.*$)\n(?=.*^\1$) 或终端命令实现保序去重。

Sublime Text 没有真正“保序去重”的原生命令,所有看似一键的操作,要么只删相邻重复(Remove Duplicate Lines),要么必然打乱顺序(Sort Lines: Unique)。你要的其实是“删掉后面出现的重复行,首行不动”,这得靠正则或外部工具,不是点两下就能解决的事。
为什么 Remove Duplicate Lines 总是漏删?
它底层就是逐行比对上一行,不建哈希表、不扫描全文。比如三行:apple → banana → apple,第二个 apple 前面是 banana,直接跳过。
- 对空格、制表符、BOM、零宽字符(如
\u200B)完全敏感——"apple "和"apple"就算两行 - 不支持忽略大小写,不能跳过空行,也不能按列匹配
- 快捷键默认未绑定,必须手动在命令面板里搜才能调用
Sort Lines: Unique 为什么顺序全乱了?
它本质是先排序再合并相邻重复,等价于 Linux 的 sort -u。所以 zebra 一定排在 apple 前面,不管原文谁先出现。
- 保留的是排序后每组重复里的第一行,不是原文中第一次出现的那行
- 含数字的字符串(如
log2.txt、log10.txt)会错序,需额外装Natural Sort插件补零 - 要启用快捷键,必须手动加配置:
{"keys": ["ctrl+alt+u"], "command": "sort_lines", "args": {"unique": true}}
怎么真正保序去重?用正则 ^(.*$)\n(?=.*^\1$)
这个正则能精准匹配「后面还有相同行」的所有重复行(除第一个),适合代码、配置项等依赖原始顺序的文本。
- 打开替换面板(
Ctrl+H或Cmd+H),勾选Regular Expression和. matches newline - 查找框填:
^(.*$)\n(?=.*^\1$),替换框留空,点Replace All - Windows 文件若混用
\r\n和\n,可能匹配失败;建议先统一换行符:File → Line Endings → Unix - 超 5 万行时 Sublime 正则会明显卡顿,内存飙升——这时候别硬扛,切终端更稳
大文件或复杂规则,别硬刚内置功能
原生能力只认「整行完全一致」。以下情况它直接失效:
- 两行是
"apple,123"和"apple, 123"(空格差异) - 想按 CSV 第二列去重,而不是整行
- 需要忽略大小写(
Apple和apple算重复) - 文件编码不是 UTF-8(比如 GBK),
Sort Lines可能报UnicodeDecodeError
这时候该切到终端:Linux/macOS 用 sort -u file.txt,Windows 用 PowerShell Get-Content file.txt | Sort-Object -Unique,或者一行 Python:python3 -c "import sys; print(''.join(dict.fromkeys(sys.stdin)))"。

















