vscode正则无法跨行回溯匹配,故^(.*$)\n\1$仅能删除相邻重复行;非相邻重复需先排序再正则,或安装unique lines插件保留首次出现行。

VSCode 无法靠单次正则直接删掉非相邻重复行,必须排序+正则组合操作,或改用插件。
为什么 ^(.*$)\n\1$ 只能删相邻重复行
VSCode 的正则引擎不支持跨行回溯匹配,^(\S.*$)\n(?=.*^\1$) 这类写法在 VSCode 里根本不会生效。它只能让 \1 捕获上一行的完整内容,且严格依赖换行符为 \n(Windows 用户若文件是 \r\n,得先点右下角 CRLF → 选 LF)。
常见错误现象:替换后几乎没变化,或只删了紧挨着的两行相同内容,其余重复行原封不动。
- 必须先全选文本 →
Ctrl+Shift+P→ 输入Sort Lines→ 回车(确保启用内置命令) - 再打开
Ctrl+H,勾选.*(启用正则) - 查找框填
^(.*$)\n\1$,替换框留空,点「全部替换」
想保留原始顺序?用 Unique Lines 插件
插件 Unique Lines(作者:larryzhao)默认保留首次出现的行,逐行哈希 + Set 去重,比 Duplicate Line Remover 更可靠——后者对含空格/制表符的行容易误判。
使用前注意:
- 它严格按字符比对,
123和123被视为不同行 - 若想忽略首尾空格,得先执行
Ctrl+K Ctrl+X(Trim Trailing Whitespace) - 万行以内性能无压力;超 5 万行时 VSCode 主进程可能卡顿几秒,这是编辑器限制,非插件问题
别用 Ctrl+F + 「查找全部」手动删重复行
Ctrl+F 搜索某行内容后点「查找全部」,只会高亮匹配起始位置,不会自动选中整行,更无法区分“第几次出现”。
比如搜 apple,apple pie 和 pineapple 全被标中;即使加锚点 ^apple$,也只高亮 apple 字符本身,不是整行。
想靠鼠标多选再删?超过 20 行就极易漏选或误删,且无法保证只留第一次。
本质是功能错配——这个操作在 VSCode 里纯属误导。
去重前务必清理隐形差异
Sort Lines (Unique) 和插件都基于整行字符串完全一致判重,而真实文本里常混有:
- 行尾空格(用
Ctrl+K Ctrl+X清) - 空行(
Ctrl+H→ 正则^\s*$→ 替换为空) - BOM、全角空格、零宽字符(可复制一段“问题文本”到查找框,用「在文件中查找」验证是否真匹配)
最易被忽略的是:未保存的文件不会参与全局替换,也不被插件读取——操作前先 Ctrl+S。











