remove duplicate lines仅删相邻重复行,因其实现为逐行比对前一行,不缓存全文;sort lines: unique先排序后去重,必乱序;保序去重需正则配合统一换行符与全行匹配。

Remove Duplicate Lines 只删相邻重复行,不是全局去重——你看到的“删不干净”,其实是它根本没打算干这事。
为什么 Remove Duplicate Lines 总是漏删?
它底层就是个「当前行 vs 上一行」的逐行比对器,不建哈希表、不缓存、不扫描全文。比如这三行:
apple banana apple
第二个 apple 不会被删,因为它上一行是 banana,不是 apple。
- 对空格、制表符、BOM、零宽字符(如
\u200B)极度敏感:"hello"和"hello "被视为两行 - 不区分大小写:
Apple和apple永远不会被识别为重复 - 只作用于当前选区;没全选就调用,它只处理光标所在段落
- 混用换行符(
\r\n和\n)时,匹配直接失效
Sort Lines: Unique 为什么顺序全乱了?
这是 Sublime Text 4.4+ 的命令,本质是 sort | uniq:先按字典序重排全文,再合并相邻重复。所以原始顺序必然丢失——zebra 一定排在 apple 前面,不管原文谁先出现。
- 保留的是排序后每组里的第一行,不是原文中第一次出现的那行(比如
Apple和apple共存时,Apple可能被留,apple被删) - 含数字的字符串(如
log2.txt、log10.txt)会错序,需额外装 Natural Sort 插件补零 - 若文件含混合换行符,排序结果可能错位,导致去重失败
- 快捷键需手动加:
{"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 的正则和排序就会明显卡顿,内存占用陡增;而 CSV 多列去重、忽略大小写、按某字段比对等需求,原生命令完全无解。
- 超 10MB 文件建议换
Filter Lines插件(Package Control 安装后,命令面板搜Filter Lines: Unique) - 真要按列、忽略大小写、或保留末次出现,直接甩终端:
awk '!seen[tolower($0)]++'(忽略大小写)、awk '!seen[$2]++'(按第二列) - 插件别乱装:
Remove Duplicates类名字直白的插件,多数只是包装了默认Remove Duplicate Lines,逻辑没升级 - 操作前务必备份——Sublime 的撤销栈(
Ctrl+Z)在关闭窗口或切换标签页后就清空了











