sublime text无原生保序去重命令:remove duplicate lines仅删相邻重复,sort lines: unique会打乱原始顺序;真保序需用正则^(.*$)\n(?=.*^\1$)或filter lines插件。

Sublime Text 没有真正“删除重复行并保留原始顺序”的原生命令。所谓“自带排重功能”,实际只有两个可用命令,但行为完全不同:一个是只删相邻重复(Remove Duplicate Lines),另一个是先排序再去重(Sort Lines 带 unique: true)。选错就等于白干。
为什么 Remove Duplicate Lines 总是漏删?
它底层逻辑就是逐行比对上一行,不建哈希表、不扫描全文。比如这三行:
apple banana apple
第二个 apple 不会被删——因为它的上一行是 banana,不是 apple。常见失效场景包括:
- 重复行中间夹着其他内容(日志、注释、空行)
- 行尾多一个空格、Tab 或零宽字符(
\u200B),就被判为不同行 - 文件混用
\r\n和\n,导致换行边界错位 - 大小写不一致(
Apple和apple视为两行)
Sort Lines: Unique 为什么顺序全乱?
它本质是 sort | uniq 的封装:先按字典序重排全文,再合并相邻重复。所以 zebra 一定跑到 apple 前面,不管原文谁先出现。关键细节:
- 保留的是排序后每组重复里的第一行,不是原文中第一次出现的那行
- 含数字的字符串(如
log2.txt、log10.txt)会错序,需额外装 Natural Sort 插件补零 - 快捷键必须手动配置:
{"keys": ["ctrl+alt+u"], "command": "sort_lines", "args": {"unique": true}} - 若文件编码非 UTF-8(如 GBK),可能触发
UnicodeDecodeError
真要保序去重,别硬套内置命令
代码、配置项、日志时间线这类文本,顺序即逻辑。此时必须绕过排序,用正则或插件:
- 正则方案:
^(.*$)\n(?=.*^\1$)—— 打开查找面板(Ctrl+F),勾选 Regular Expression 和 Whole Line,输入该表达式,点 Find All,再按Ctrl+Shift+L转多光标,最后Delete - 统一换行符:Windows 文件若混用
\r\n和\n,匹配易失败;务必先执行File → Line Endings → Unix - 大文件(>5 万行)慎用正则:Sublime 内存占用陡增、响应卡顿,实测 10 万行文本可能卡死数秒
- 更稳选择:
Filter Lines插件(Package Control 可装),提供Filter Lines: Unique命令,行为等价于awk '!seen[$0]++',保序、高效、支持选区
最常被忽略的一点:没想清“什么是重复”,所有操作都白搭。是整行?某几列?是否忽略首尾空格或大小写?Remove Duplicate Lines 和 Sort Lines: Unique 都只认“整行完全一致”。一旦有空格差异、大小写混用、或只想按 CSV 第二列比对,它们立刻失效。











