sublime text 无真正保序全局一键删重功能:remove duplicate lines 仅比对相邻行,sort lines: unique 会打乱原序,保序需手动正则且依赖换行符统一和“. matches newline”开关,大文件应改用 awk 等终端命令。

Sublime Text 没有真正保序、全局、一键删除重复行的功能——所有“删重”操作都依赖你明确判断:要保留顺序?能接受排序?是否容忍空格/大小写差异?选错路径,删一半就停了,还误以为已经清完。
Remove Duplicate Lines 为什么总像没反应
它只比对「当前行和上一行是否完全一致」,不建哈希表、不扫描全文、不缓存历史。比如这三行:
apple banana apple
第二个 apple 不会被识别,因为它的上一行是 banana,不是 apple。常见失效场景包括:
- 行尾多一个空格、\t 或零宽字符(\u200B),"abc" 和 "abc " 就算两行
- 文件混用 \r\n 和 \n,导致换行边界错位,^/$ 锚点失效
- 未全选时,只处理光标所在段落,不是全文
- 大小写不归一:Apple 和 apple 永远不会被合并
Sort Lines: Unique 看似省事,但顺序全乱了
这是 Sublime Text 4.4+ 的命令,本质是 sort -u:先字典序重排,再合并相邻重复。结果是 zebra 一定排在 apple 前面,不管原文谁先出现。关键细节:
- 它保留的是「排序后每组重复里的第一行」,不是原文中第一次出现的那行
- 含数字的字符串(如 log2.txt、log10.txt)会按 ASCII 排序,log10 排在 log2 前面,需 Natural Sort 插件补零
- 若文件编码非 UTF-8(如 GBK),可能触发 UnicodeDecodeError
- 快捷键必须手动配置:{"keys": ["ctrl+alt+u"], "command": "sort_lines", "args": {"unique": true}}
保序去重只能靠正则 ^(.*$)\n(?=.*^\1$)
这是 Sublime 原生唯一可靠保序方案:匹配「后面还有相同行」的所有重复实例(首行跳过)。但极易因设置遗漏而失效:
- 必须先统一换行符:菜单 → File → Line Endings → Unix(否则 ^/$ 错位)
- 打开查找面板(Ctrl+F),勾选 Regular Expression 和 Whole Line
- 右下角点 .* 图标启用 . matches newline(漏点它,整个预查逻辑直接失效)
- 输入 ^(.*$)\n(?=.*^\1$) → Find All → Ctrl+Shift+L 转多光标 → Delete
- 若仍有残留,大概率是尾部空白干扰:先 Find → Replace,查找 \s+$,替换为空,再重跑正则
大文件(>5 万行)别硬扛内置正则
Sublime 的正则引擎在大文本中会卡顿、假死,且无法中断。此时应切到终端,用更鲁棒的工具:
- 保序去重(留第一处):awk '!seen[$0]++'
- 带空格归一化:awk '{gsub(/^[ \t]+|[ \t]+$/, ""); if (!$0) next} !seen[$0]++'
- 忽略大小写:awk '{low = tolower($0); if (!seen[low]++) print}'
- 处理完粘贴回 Sublime 即可(无需插件、不卡顿、结果确定)
真正容易被忽略的是:正则里那个 . matches newline 开关——漏点它,\n 就不参与匹配,整个预查逻辑直接失效;而大文件卡住时,很多人反复调参数,却忘了换外部命令才是更稳的路径。











