Sublime Text原生命令可高效去重:先Sort Lines再Remove Duplicate Lines,注意空格/BOM/大小写敏感性;保留顺序需正则替换;结构化数据应先格式化;语义重复须依赖外部工具。

Sublime Text 原生命令就能去重,不用装插件
Sublime Text 自带 Sort Lines 和 Remove Duplicate Lines 两个命令,配合得当,比多数插件更稳、更快,也不用担心插件更新拖累启动速度。关键不是“能不能去重”,而是“怎么避免把不该去的行也删了”。
常见错误现象:Remove Duplicate Lines 会严格按整行文本匹配,哪怕前后空格、换行符、BOM 不同,它都算“不同行”;反过来,如果两行内容完全一样但位置相邻或不相邻,它只留第一处——这点容易误伤配置项或日志中本该保留的重复标记。
- 使用前务必先
Sort Lines(否则Remove Duplicate Lines只能删掉连续重复) - 如果要去重但保留原始顺序,得用正则替换 + 查找面板:搜索
^(.*$)\n\1$,替换为\1,并勾选Regular Expression和Wrap Around - 对 JSON 数组、import 列表这类结构化重复,建议先格式化(
Ctrl+Alt+Shift+P→JSON: Reindent),再排序去重,否则缩进差异会导致去重失效
用正则批量处理“看似重复实则不同”的行
比如日志里 [INFO] 2024-05-20 10:00:00 user login 和 [INFO] 2024-05-20 10:00:01 user login 时间戳不同,但你想按行为模式去重——这时候原生命令完全没用,必须靠正则。
典型场景:清理重复 import、合并相同函数调用、剔除带时间戳的日志中的语义重复项。
- 打开查找面板(
Ctrl+H),启用Regular Expression - 匹配“忽略时间戳的重复行”:搜索
^\[.*?\]\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s+(.+)$,替换为\1,再配合排序去重 - 注意
.默认不匹配换行,多行匹配要加(?s)前缀;行首锚点^在“Find in Files”里可能失效,优先在单文件中操作 - 正则测试时先用
Find All看命中的行数,别急着Replace All
Sublime 的 sort_lines 命令参数影响去重结果
sort_lines 行为不是固定的,它受当前语法高亮、是否开启 case_sensitive、以及是否有选中文本影响。默认是大小写敏感排序,而很多配置文件(如 .env、nginx.conf)对大小写不敏感,这就导致 Remove Duplicate Lines 漏掉本该合并的 PORT=3000 和 port=3000。
- 想大小写无关排序:在命令面板(
Ctrl+Shift+P)输入Sort Lines (case insensitive),或绑定快捷键到{"command": "sort_lines", "args": {"case_sensitive": false}} - 仅对选中区域排序:必须先选中,否则作用于全文;如果忘了选,去重后发现其他地方被意外调整顺序,就是这个原因
- 排序后空行会被移到最前,若空行本身有语义(如分隔段落),需手动补回或用正则先过滤空行:
^\s*$
别依赖插件做“智能去重”,Sublime 不是 IDE
像 Advanced CSV 或 Text Pastry 这类插件,标榜“按列去重”“保留注释”,实际运行时容易卡顿、崩溃,尤其在 10MB+ 的日志或 SQL 导出文件上。Sublime 的核心优势是轻量和确定性,一旦引入复杂逻辑,就违背了它的定位。
真正需要结构化去重(比如按 CSV 第三列合并、跳过 header 行),应该导出到命令行工具处理:sort -t, -k3,3 file.csv | uniq -f2,再拖回 Sublime —— 这比任何插件都快、可复现、无副作用。
- 插件
Remove Duplicate Lines的源码其实就十几行 Python,本质还是调用view.substr()+set(),没做任何语义分析 - 如果你常处理代码重复,不如在项目根目录放个
.sublime-project,预设好sort_lines快捷键和常用正则片段 - 最易被忽略的一点:Sublime 的“重复行”判断永远基于字符串相等,它不知道
import os和from os import path是语义重复——这种只能靠 linter 或专用工具










