notepad++无真正一键去重功能;需先排序再用正则^(.*)(\r?\n\1)+$替换实现全局去重,或用python脚本保持原序去重。

Notepad++ 本身没有“一键去重”功能,所谓“删除重复行”必须借助排序 + 正则替换,或使用插件;直接选中后点菜单里的“删除重复行”是假动作,它只删相邻重复行(类似 uniq),不是真正去重。
为什么“文本排序 → 删除重复行”不能直接用
Notepad++ 自带的 TextFX → TextFX Tools → Delete duplicate lines 只处理连续重复的行——比如三行都写“apple”,它只会留第一行,删掉后面两行;但如果“apple”分散在第2、第15、第87行,它完全无感。
- 这是最常被误用的操作,用户以为点了就全局去重,结果文件看起来还是有重复
- 根本原因是该命令底层逻辑等价于
awk '!a[$0]++'的相邻模式,而非哈希去重 - 若你真需要保留原始顺序去重,这个菜单项完全不适用
真正有效的手动去重:排序 + 正则两步法
这是纯内置功能、零插件、Windows/macOS/Linux 通用方案,适合中小文本(~10MB以内):
- 先执行
编辑 → 行操作 → 排序行(升序)(或快捷键Alt + Shift + S) - 再打开替换对话框(
Ctrl + H),勾选正则表达式,查找框填:^(.*)(\r?\n\1)+$,替换框留空 - 点击
全部替换—— 注意:要多点几次,直到提示“未找到匹配项”,因为正则一次只消一组连续重复 - 最后再
编辑 → 行操作 → 删除空行清理残留
说明: 是反向引用,匹配上一行内容;\r?\n 兼容 Windows / Unix 换行;该正则只对已排序文本有效。
大文件或需保持原顺序?用 Python 脚本更可靠
Notepad++ 处理超 20MB 文本会卡顿,且无法保持首次出现顺序去重。此时建议导出为 input.txt,用以下脚本:
with open('input.txt') as f:
seen = set()
for line in f:
stripped = line.rstrip('\n\r')
if stripped not in seen:
print(stripped)
seen.add(stripped)
运行后重定向输出:python dedup.py > output.txt。关键点:
-
rstrip('\n\r')避免换行符导致相同内容被当成不同行 - 用
set()判断,O(1) 查找,百万行也能秒出结果 - 不依赖 Notepad++ 插件,避免
PythonScript插件版本兼容问题(如 v2.0 不支持 Python 3.12)
真正去重的核心从来不是“有没有按钮”,而是明确你要的是“去相邻重复”还是“全局唯一”——前者用自带菜单,后者必须排序+正则或外部脚本;另外,所有正则方案都要求先排序,这点容易被跳过,一跳就白忙活。











