Sublime Text 无原生“一键高亮所有重复行”功能,因 Remove Duplicate Lines 仅比对相邻行、不建哈希表;需用正则 ^(.*$)\n(?=.*^\1$)(须开启 . matches newline 并统一换行符)或 Filter Lines 插件实现,大文件推荐 awk 命令。

Sublime Text 没有“一键高亮所有重复行”的原生命令——Remove Duplicate Lines 只删相邻重复,不标记、不查找、不提示非相邻重复;真要定位全部重复行,必须用正则预查或插件。
为什么 Remove Duplicate Lines 根本查不到非相邻重复行
它不是扫描全文建哈希表,而是逐行比对「当前行是否和上一行完全一致」。比如这三行:
apple banana apple
第二个 apple 不会被识别为重复,因为它的上一行是 banana。它不缓存历史、不回溯、不区分大小写、也不处理尾部空格或零宽字符(u200B)。
常见误判场景包括:
-
"abc"和"abc "(末尾多一个空格)被视为不同行 - 混用
和时,^/$锚点失效,正则直接崩 - 未全选文本时,
Remove Duplicate Lines只作用于光标所在段落 - 空行会中断匹配链,导致后续重复漏判
用正则 ^(.*$)
(?=.*^$) 真实高亮所有后续重复行
这是 Sublime 原生支持的唯一可靠查找方式:靠向后预查判断某行是否在后续还会出现,只匹配「后面还有相同行」的实例(首行跳过)。
操作前必须做两件事:
- 统一换行符:菜单 →
File → Line Endings → Unix(否则^和$错位) - 清理尾部空白:先
Ctrl+H查找s+$,替换为空,再跑正则
然后执行:
- 打开查找面板(
Ctrl+F),勾选Regular Expression和Whole Line - 右下角点
.*图标启用. matches newline(漏这步,整个预查逻辑失效) - 输入:
^(.*$) (?=.*^$)→ 点Find All - 此时所有非首次出现的重复行会被高亮选中
用 Filter Lines 插件直接提取重复行列表
装完插件后,它能反向输出「哪些行真正重复了」,适合审计或生成差异报告,比正则更直观。
安装与使用步骤:
- 按
Ctrl+Shift+P→ 输入Package Control: Install Package→ 搜索并安装Filter Lines - 全选目标文本,再按
Ctrl+Shift+P→ 输入Filter Lines: Duplicates回车 - 结果只保留所有出现 ≥2 次的行(每组重复只留一次)
- 再执行
Filter Lines: Unique,就是去重后的干净版本
注意:插件默认严格字符串匹配,如需忽略大小写或首尾空格,得先手动处理——比如用 Ctrl+K Ctrl+L 转小写,或 Ctrl+H 清理 ^s+|s+$。
大文件(>5 万行)别硬扛内置正则
Sublime 的正则引擎在大文本中会卡顿、假死,且无法中断。此时应切到终端,用更鲁棒的命令:
- 保序去重(留第一处):
awk '!seen[$0]++'(自动兼容混合换行符、忽略 BOM) - 忽略大小写:
awk '{low = tolower($0); if (!seen[low]++) print}' - 归一化空格:
awk '{gsub(/^[ ]+|[ ]+$/, ""); if (!$0) next} !seen[$0]++'
处理完复制回 Sublime 即可。真正容易被忽略的是:. matches newline 开关和换行符统一这两步——90% 的正则失效都源于此;而大文件卡住时,很多人反复调参数,却忘了外部命令才是更稳的路径。











