sublime text 无原生保序去重功能,remove duplicate lines 仅删相邻重复行,因其实现为逐行比对而非哈希查重;可靠方案是正则 ^(.*$)\n(?=.*^\1$) 配合 . matches newline,或大文件时用 awk '!seen[$0]++'。

Sublime Text 没有“一键定位并删除所有重复行”的原生命令——Remove Duplicate Lines 只删相邻重复,Sort Lines: Unique 必然打乱顺序,真要保序删重(比如清理 import 列表或 API 响应体),必须用正则预查配合手动清理。
为什么 Remove Duplicate Lines 根本定位不了非相邻重复?
它不是扫描全文,而是逐行比对「当前行是否和上一行完全一致」。比如这三行:
apple banana apple
第二个 apple 不会被识别为重复,因为它的上一行是 banana。它不建哈希表、不缓存历史、不回溯,也不高亮、不提示。
- 对尾部空格、
\t、\u200B(零宽空格)极度敏感:"abc"和"abc "算两行 - 混用
\r\n和\n时,^/$锚点失效,匹配直接崩 - 未全选时,只处理光标所在段落,不是全文
- 大小写不归一:
Apple和apple永远不会被合并
用 ^(.*$)\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]++'(自动忽略 BOM、兼容混合换行符) - 带空格归一化:
awk '{gsub(/^[ \t]+|[ \t]+$/, ""); if (!$0) next} !seen[$0]++' - 忽略大小写:
awk '{low = tolower($0); if (!seen[low]++) print}' - 处理完粘贴回 Sublime 即可(无需插件、不卡顿、结果确定)
真正容易被忽略的是:正则里那个 . matches newline 开关——漏点它,\n 就不参与匹配,整个预查逻辑直接失效;而大文件卡住时,很多人反复调参数,却忘了换外部命令才是更稳的路径。











