Sublime Text 无真正一键全局去重保序功能:Remove Duplicate Lines 仅删相邻重复且不跨行检测,Sort Lines: Unique 会打乱原始顺序;保序需用正则^(.*$)\n(?=.*^\1$)并统一换行符,大文件推荐awk或Python等外部命令。

Sublime Text 没有真正意义上的“一键全局去重并保序”功能,所有看似能直接删重复行的操作,要么只删相邻重复(Remove Duplicate Lines),要么必然打乱原始顺序(Sort Lines: Unique)。你得先明确:要保序?要处理大文件?还是只要快速清掉肉眼可见的连续重复?选错路径,5 分钟操作可能白干。
为什么 Remove Duplicate Lines 总是漏删
这个命令只比对「当前行和上一行是否完全相同」,不建哈希表、不缓存历史、不跨行扫描。比如三行是 apple → banana → apple,它完全无视第二个 apple。
- 空格、制表符、BOM、零宽字符(U+200B)、末尾不可见换行符都会导致判为“不同”——
"hello"和"hello "是两行 - 不支持忽略大小写,
Apple和apple被视为不同 - 不跳过空行,空行之间夹着内容也会中断匹配链
- 快捷键或菜单调用前若未全选,它只作用于当前光标所在段落,不是全文
Sort Lines: Unique 为什么不能直接用
这是 Sublime Text 4.4+ 新增命令,本质是「先排序 + 合并相邻重复」。它确实一步到位,但原始顺序彻底丢失——zebra 一定排在 apple 前面,不管原文档里谁先出现。
- 它保留的是字典序最小的那行,不是原文中第一次出现的那行(比如
Apple和apple共存时,Apple可能被删) - 若文件含混合换行符(
\r\n和\n并存),排序结果可能错位,后续去重失效 - 默认不启用大小写归一化,排序前需手动
Ctrl+K, Ctrl+L全转小写,否则大小写混排会拆散本应合并的组 - 快捷键需手动绑定:
{"keys": ["ctrl+alt+u"], "command": "sort_lines", "args": {"unique": true}}
保序去重:正则 ^(.*$)\n(?=.*^\1$) 怎么写才不翻车
这个正则能匹配「后面还有相同行」的所有重复行(除第一个),适合代码、配置项等依赖顺序的文本,但细节决定成败。
- 必须先统一换行符:菜单
File → Line Endings → Unix,否则\r\n会让^和$错位匹配 - 查找面板中务必勾选
Regular Expression和Whole Line;若文本含多行注释或嵌套换行,还要点开右下角.*按钮启用. matches newline - 输入
^(.*$)\n(?=.*^\1$)后,先点Find All,再按Ctrl+Shift+L转多光标,最后按Delete—— 这样首行自动保留,不会误删 - 如果替换后仍有残留,说明存在尾部空格干扰,先执行
Find → Replace,查找\s+$,替换为空,再跑正则
大文件或高频处理:别硬扛,换外部命令
超过 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 "print(''.join(dict.fromkeys(open('file.txt'))))" > dedup.txt - 操作前务必
Ctrl+S保存副本——Sublime 正则Replace All不记录逐行 undo,误操作可能整块变空,Ctrl+Z回不全
真正容易被忽略的不是命令怎么写,而是“什么是重复”没想清楚:是整行?某几列?是否该忽略首尾空格?是否要区分大小写?没定义清楚这点,换十个插件或写十遍正则,结果都不可控。

















