sublime text的remove duplicate lines命令仅删除相邻重复行,因其逐行比对且仅匹配上一行完全相同的行;非相邻重复、空白符或换行符差异均导致失效。

Sublime Text 自带的 Remove Duplicate Lines 命令不能直接全局去重,它只删相邻重复行;想真正删掉所有重复项,必须先排序,或换用正则/插件。
为什么 Remove Duplicate Lines 总是漏删?
这个命令底层逻辑很简单:逐行比对,只删除和**上一行内容完全相同**的行。只要两行重复但中间隔了其他内容,就完全识别不到。
- 比如三行顺序是
apple→banana→apple,它不会删第二个apple - 空格、制表符、BOM、换行符差异(
\r\nvs\n)都会导致判为“不同”,哪怕肉眼看一模一样 - 它不区分大小写,也不忽略首尾空白——
hello和hello被视为两行
可靠去重三步法:排序 + 正则替换
这是不装插件、兼容性最好、大中小文件都稳的方法,关键在正则写法和执行节奏:
- 全选文本(
Ctrl+A或Cmd+A) - 调出命令面板(
Ctrl+Shift+P),输入Sort Lines并回车 - 打开替换面板(
Ctrl+H),勾选Regular Expression(点.*图标) - 查找框填:
^(.*$)\n^\1$,替换框留空 - 点
Replace All—— 如果提示“0 occurrences found”,说明已清完;否则再点一次
注意:\n 在 Windows 文件里可能匹配不到 \r\n,保险起见可改用 ^((?s:.*))$\s+^$,但多数情况原式就够用。
想保留原始顺序?别用 Sort Lines,改用插件或 Python 控制台
内置功能无法保序去重,硬套排序会打乱数据逻辑(比如日志时间线、代码执行顺序)。这时候有两个实际可用路径:
- 安装
Find Duplicate Lines插件后,全选 →Ctrl+Shift+P→ 输入Remove All Duplicates,自动保留首次出现行 - 或用 Sublime 内置 Python 控制台(
Ctrl+`)粘贴脚本:import sublime, sublime_plugin view = sublime.active_window().active_view() regions = view.sel() if not regions: regions = [sublime.Region(0, view.size())] for region in regions: lines = view.substr(region).splitlines(keepends=True) seen = set() unique_lines = [] for line in lines: if line not in seen: seen.add(line) unique_lines.append(line) view.replace(sublime.Edit(), region, ''.join(unique_lines))这段代码严格按行字符串做全局判重,不碰空格、不排序、不丢换行符
大文件(10 万行以上)或需条件去重时,别在 Sublime 里硬扛
Sublime 的正则引擎在大文本下容易卡顿甚至无响应,且不支持“按列去重”“忽略大小写”“跳过空行”等常见需求:
- 终端一行搞定(Linux/macOS):
sort -u input.txt > output.txt - Windows PowerShell:
Get-Content input.txt | Sort-Object -Unique | Set-Content output.txt - 需要保序且复杂过滤?直接写 Python 脚本:
python3 -c "import sys; seen=set(); [print(l, end='') for l in sys.stdin if l not in seen and not seen.add(l)]"
真正容易被忽略的是:Sublime 的任何去重操作都不做备份。处理前务必 File → Save As… 另存副本,尤其是用正则反复点 Replace All 时,错一次就很难回退。











