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。
- 对空格、制表符、BOM、零宽字符(如
\u200B)零容忍:哪怕末尾多一个空格,就判为不同行 - 不支持忽略大小写,不能跳过空行,也不能按列匹配
- 快捷键默认未绑定,得手动在命令面板里搜
Remove Duplicate Lines才能调用
为什么 Sort Lines: Unique 会乱序?
它本质是 sort | uniq 的封装:先按字典序重排全文,再合并相邻重复。所以 zebra 一定跑到 apple 前面,不管原文谁先出现。
- 保留的是排序后每组重复里的第一行,不是原文中第一次出现的那行
- 要启用它,必须手动加快捷键配置:
{"keys": ["ctrl+alt+u"], "command": "sort_lines", "args": {"unique": true}} - 对含数字的字符串(如
log2.txt、log10.txt)会错序,需 Natural Sort 插件补零
怎么真正保序去重?用正则 ^(.*$)\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 > dedup.txt(保序) 或sort -u file.txt > dedup.txt(排序后去重) - Windows PowerShell:
Get-Content file.txt | ForEach-Object {$seen{$_.Trim()}++ -eq 1} | Set-Content dedup.txt(保序,需手动Trim()) - 跨平台 Python 一行:
python3 -c "import sys; seen=set(); [print(l.rstrip()) for l in sys.stdin if l not in seen and not seen.add(l)]" dedup.txt
真正容易被忽略的是:很多“重复”其实源于末尾空格或不可见字符。处理前先跑一遍 \s+$ 清理尾部空白,比纠结用哪个命令更关键。

















