sublime text无原生保序去重命令,remove duplicate lines仅删相邻重复且敏感于空白字符,sort lines: unique会打乱顺序;保序需用正则^(.*$)\n(?=.*^\1$)或外部命令如awk '!seen[$0]++'。

Sublime Text 没有“一键去重并保序”的原生命令,所有看似能直接删重复行的操作,要么只删相邻重复(Remove Duplicate Lines),要么会打乱原始顺序(Sort Lines: Unique)。真要安全、可控地删重复行,得先明确你要什么:保序?还是高效?还是处理大文件?
为什么 Remove Duplicate Lines 总是漏删?
这个命令来自 Sublime 自带的 Text 插件,但它只比对「当前行和上一行是否完全相同」。如果重复行中间隔了别的内容,它就视而不见。
- 比如三行:
apple→banana→apple,它不会删掉第二个apple - 它对空格、制表符、BOM、零宽字符极度敏感——
apple(末尾空格)和apple被视为两行 - 不支持忽略大小写、不支持按列匹配、不能跳过空行
Sort Lines: Unique 为什么顺序全乱了?
这是 Sublime Text 4.4+ 新增的命令,本质是「先排序 + 再合并相邻重复」。它确实一步到位,但原始顺序必然丢失。
- 执行后,
zebra一定排在apple前面,不管原文档里谁先出现 - 它默认保留每组重复中的第一行(按字典序排完后的第一行),不是原文中第一次出现的那行
- 快捷键绑定需手动加配置:
{"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可能导致匹配失败,建议先统一换行符为 Unix(File → Line Endings → Unix)
大文件或高频处理,别硬扛——换外部命令
超过 5 万行时,Sublime 的排序和正则会明显卡顿,且内存占用陡增。这时候用系统工具更稳:
- Linux/macOS 终端:
sort -u file.txt > dedup.txt(会排序) 或awk '!seen[$0]++' file.txt > dedup.txt(保序) - Windows PowerShell:
Get-Content file.txt | Sort-Object -Unique(排序) 或Get-Content file.txt | ForEach-Object {$seen{$_.Trim()}++ -eq 1} | Set-Content dedup.txt(保序需手动去空格) - Python 一行(跨平台):
python3 -c "lines = open('file.txt').readlines(); print(''.join(dict.fromkeys(lines)), end='')"
真正容易被忽略的是:所有 Sublime 方法都对不可见字符零容忍。哪怕一行末尾多一个 \t 或 U+200B,就逃过所有去重逻辑——处理前先用正则 \s+$ 清尾空格,往往比纠结命令更重要。











