Notepad++无法一键标记所有重复行,因其缺乏全局哈希比对机制;唯一稳定方案是先排序使重复行相邻,再用正则^(.*\r?\n)\1+反复替换,必要时加行号锚定以恢复原始顺序。

Notepad++ 无法真正“一键”标记所有重复行
它没有内置的全局哈希比对机制,所谓“一键标记重复行”在原生功能中根本不存在。你看到的某些教程说用一条正则就能搞定,比如 ^(.*?)$\s+?^(?=.*^\1$),实际测试会漏匹配、跨行错位、甚至卡死——这个正则依赖 ^ 和 $ 的多行上下文行为,在 Notepad++ 的正则引擎里不稳定,且不兼容 CRLF/LF 混合换行。
能稳定标记所有重复行的唯一可行路径:先排序再正则匹配
核心逻辑是让重复内容物理相邻,才能被正则准确识别。这不是妥协,而是 Notepad++ 正则引擎的能力边界决定的。
- 全选文本 →
编辑 → 行操作 → 排序行(升序) - 打开替换对话框(
Ctrl + H),勾选正则表达式和匹配新行 - 查找目标填:
^(.*\r?\n)\1+;替换为:\1 - 点“全部替换”,直到提示“未找到匹配项”——因为一次只消一组连续重复,需反复执行
- 最后执行
编辑 → 行操作 → 删除空行清理残留
想保留原始顺序?必须加行号锚点
排序会打乱原始位置,如果你后续还要按原始顺序分析(比如日志时间线),就得提前锚定:
- 进入列编辑模式(
Alt + C)→ 插入数字,起始为1,增量1,右对齐 - 全选 → 排序行(升序)→ 此时相同内容的行已聚堆,但每行开头有唯一序号
- 执行正则:
^(.*?\r?\n)\1+→ 替换为\1 - 再用列编辑选中最左一列序号,
Delete删除
这四步看似繁琐,但它是目前唯一能在不装插件前提下,兼顾去重准确性与原始顺序可恢复性的方案。
别信“Remove Consecutive Duplicate Lines”能全局去重
菜单里的 TextFX → Delete duplicate lines 或新版中的 编辑 → 行操作 → 删除连续重复行,底层逻辑等价于 Unix uniq:只删紧挨着的重复行。例如三行 apple 连续出现,它留第一行;但如果 apple 分散在第 3、17、92 行,它完全无感——这不是 bug,是设计如此。
真正容易被忽略的点是:很多人做完排序后忘了多次点击“全部替换”,导致只清掉部分重复组;还有人用错正则中的 \r?\n,在 macOS/Linux 环境下漏掉换行符判断,结果最后一行永远残留。


















