sublime text 无真正保序去重的一键命令:remove duplicate lines 仅比对相邻行,sort lines + unique 会打乱原始顺序;可靠方案是正则 ^(.*$)\n(?=.*^\1$) 配合多光标删除,或用 awk '!seen[$0]++' 等外部命令。

Sublime Text 没有真正保序去重的“一键命令”——所有自带功能要么只删相邻重复,要么必然打乱顺序。 你看到的 Remove Duplicate Lines 和 Sort Lines(含 unique 参数)都是半截子方案,用错场景就会漏删、错删或顺序崩坏。
为什么 Remove Duplicate Lines 总是删不干净
它底层就是个「当前行 vs 上一行」的朴素比对,不建哈希表、不扫全文、不记历史。比如这三行:
apple banana apple
第二个 apple 完全不会被识别——因为它前面是 banana,不是 apple。
- 对空格、制表符、BOM、零宽字符(如
\u200B)完全敏感:哪怕末尾多一个空格,就判为不同行 - 不支持忽略大小写,不能跳过空行,也不支持按列匹配
- 默认没绑定快捷键,得手动进命令面板搜才能调用
为什么 Sort Lines + unique: true 会乱序
它本质是 sort | uniq 的封装:先按字典序重排全文,再合并相邻重复。所以 zebra 一定跑到 apple 前面,不管原文谁先出现。
- 保留的是排序后每组重复里的第一行,不是原文中第一次出现的那行
- 含数字的字符串(如
log2.txt、log10.txt)会错序,需额外装Natural Sort插件补零 - 快捷键必须手动加配置:
{"keys": ["ctrl+alt+u"], "command": "sort_lines", "args": {"unique": true}}
怎么真正保序去重:正则 ^(.*$)\n(?=.*^\1$)
这个正则是目前最可靠、无需插件的保序方案,能精准匹配「后面还有相同行」的所有重复行(首行自动跳过),适合代码、配置项、日志等依赖原始顺序的文本。
- 打开查找面板(
Ctrl+F),勾选Regular Expression和Whole Line - 输入
^(.*$)\n(?=.*^\1$),点Find All - 按
Ctrl+Shift+L转为多光标,再按Delete—— 首次出现的行天然不匹配,不会被误删 - Windows 文件若混用
\r\n和\n,可能匹配失败;建议先统一换行符:File → Line Endings → Unix
大文件(>5 万行)别硬扛,换外部命令
Sublime 在处理大文本时,正则和排序都会明显卡顿,内存占用飙升。这时候直接甩给终端更稳:
- Linux/macOS:
awk '!seen[$0]++' file.txt - Windows(WSL 或 Git Bash):同上
- PowerShell(原生):
Get-Content file.txt | Sort-Object -Unique(但会排序);保序需用Get-Content file.txt | ForEach-Object {$seen = @{}; if (-not $seen.ContainsKey($_)) { $_; $seen[$_] = 1 }}
真正难的不是写对正则,而是判断该不该保序、要不要处理空白、换行符是否混用——这些细节一错,整批数据就废了。











