VSCode 自带正则去重需先排序,否则 ^(.*$)\n\1$ 无效;保序推荐 Unique Lines 插件;大文件或跨文件应使用命令行或脚本处理。

VSCode 自带正则只能删相邻重复行,非排序后不可用
直接用 ^(.*$)
$ 去重,前提是文本已按行排序。VSCode 的正则引擎不支持跨行回溯,^(S.*$)
(?=.*^$) 这类写法根本不会匹配成功——它连第一个 都捕获不到。你看到“没反应”或“只删了两行”,大概率是忘了排序这步。
操作顺序必须严格:
- 全选文本 →
Ctrl+Shift+P→ 输入Sort Lines (Unique)(注意:不是Sort Lines Ascending) - 若发现没去重,说明有隐形差异:空格、制表符、
混用。先执行Ctrl+K Ctrl+X(Trim Trailing Whitespace),再用Ctrl+H→ 正则^s*$→ 替换为空删空行 - 确认换行符统一:右下角点击
CRLF→ 选LF - 再打开替换面板,启用正则,查找
^(.*$) $,替换框留空,点「全部替换」
想保留原始顺序?别硬扛正则,装插件更稳
靠排序+正则本质是牺牲顺序换确定性。如果你的文本是日志时间戳、配置项顺序、或 import 列表,顺序不能动,就别折腾正则了。
实测推荐 Unique Lines(作者 larryzhao):
- 安装后,全选 →
Ctrl+Shift+P→ 输入Unique Lines: Remove Duplicates - 它逐行哈希比对,严格字符级相等(含首尾空格),不会把
abc和abc当作重复 - 不支持“忽略空格”选项,想模糊去重?得提前手动跑一遍
Trim Trailing Whitespace - 5 万行以内响应正常;超量时 VSCode 主进程会卡顿几秒——这是编辑器限制,不是插件问题
别用 Ctrl+F「查找全部」手动删,那是伪操作
Ctrl+F 搜某行内容,点「查找全部」,只会高亮匹配起始位置,**不会选中整行**,更不会标记“第几次出现”。你看到一堆高亮,其实是错觉。
典型误操作:
- 搜
console.log,结果console.log('x')和myconsole.log全被标出来 - 加锚点
^console.log$,高亮仍只是console.log这几个字符,无法一键选中整行删除 - 靠鼠标多选再删?20 行以上极易漏选,且无法保证只留第一次出现的那行
这个动作在逻辑上就不成立:VSCode 的「查找全部」不是「选择全部匹配行」,功能和需求完全错配。
大文件或跨文件去重?得切到命令行或脚本
VSCode 插件和内置功能都只作用于当前打开的编辑器标签页。如果要处理 src/**/*.ts 下所有文件里的重复 import 行,或者单个 20MB 的日志文件,VSCode 就力不从心了。
更可行的路径:
- 导出文本到临时文件 → 用
sort -u(Linux/macOS)或Get-Content file.txt | Sort-Object | Get-Unique(PowerShell) - VSCode 中打开多个文件后,无法批量去重;但可以用
Ctrl+Shift+F全局搜索 + 替换,前提是重复内容有固定模式(如import .* from) - 真正要保序+跨文件+大体量,得写简单脚本:Python 的
set()+dict.fromkeys()保持插入顺序,比任何插件都可靠
最常被忽略的一点:所谓“重复行”,VSCode 默认以整行字符串完全一致为判据。哪怕只有末尾一个空格不同,它就当两行。实际清洗前,永远先问一句:你定义的“重复”,到底要不要忽略空白?这个判断决定了该排序、该插件、还是该切出去跑脚本。


















