sublime text需先排序再用正则^(s*.+)$\n^\1$删除相邻重复行,且须统一换行符;大文件或需保序时推荐shell或python方案。

Sublime Text 里没有内置“去重”功能,得靠正则 + 排序组合实现
Sublime Text 本身不提供“删除重复行”或“提取唯一行”的原生命令,Sort Lines 只能排序,不能去重。直接选中所有内容后点 Sort Lines,重复行依然保留——这是最常被误以为有效的操作。
真正可行的路径是:先排序,再用正则匹配相邻重复行并删掉其中一份。这个流程依赖两个关键动作,缺一不可。
-
Sort Lines(菜单:Edit → Line Operations → Sort Lines)——必须先做,否则正则无法识别“相邻重复” - 正则替换:
^(s*.+)$ ^$替换为,需开启Regular Expression和Match Whole Line(即勾选.和^$按钮) - 重复执行该替换,直到替换数为 0(因为一次只能删掉每组重复中的一个副本)
正则表达式 ^(s*.+)$
^$ 的实际含义和限制
这个正则只匹配“完全相同的两行紧挨着”的情况,s* 允许开头有空格或制表符,.+ 匹配非空行内容,
^$ 确保下一行和上一行文本(含空白)一字不差。
它不处理以下情况:
- 三行及以上连续重复(如 A、A、A),一次只能消掉中间那个 A,得手动多点几次替换
- 行尾空格/换行符差异(比如一行末尾多一个空格),会被视为不同行,正则不匹配
- 大小写混杂(
Apple和apple)默认不视为重复,除非开启Case Sensitive并手动关掉(但关了又会影响字母顺序排序) - 空行会被跳过,因为
.+不匹配空行;若需保留一个空行,得另加规则
替代方案:用 Python 或 shell 命令更可靠,尤其处理大文件
当行数超过几千、或需要严格按首次出现顺序保留唯一行(而非排序后去重)时,Sublime 内置方法就力不从心了。这时直接调外部工具反而更快。
- 在 Sublime 中全选内容 → 右键 →
Copy,然后粘贴到终端执行:pbpaste | sort -u | pbcopy(macOS)或xclip -o | sort -u | xclip -i(Linux) - 想保持原始顺序?用 Python 一行:
pbpaste | python3 -c "import sys; seen = set(); [print(l, end='') for l in sys.stdin if not (l in seen or seen.add(l))]" | pbcopy - 注意:
sort -u是字节序排序去重,和 Sublime 的 Unicode 排序结果可能不一致;Python 方案无排序,纯按输入顺序 - Sublime 插件
Text Pastry或Advanced CSV都不解决去重,别白装
容易被忽略的细节:行尾符不统一会导致去重失败
如果你的文本混合了
(Unix)、
(Windows)甚至
(old Mac),那么 ^(s*.+)$
^$ 中的
就无法匹配
,正则直接失效。
解决办法很简单,但很多人跳过:
- 先统一换行符:菜单 Edit → Line Endings → 选
Unix (LF)或Windows (CRLF) - 或者在正则替换时把
改成R(Sublime 支持的通用换行符语法),即用^(s*.+)$R^$ - 但注意:
R在某些旧版 Sublime(如 3.2 之前)不支持,会报错;建议升级到最新 Stable 版
去重这事,表面是点几下鼠标,背后全是边界条件。顺序、空白、换行符、重复长度——漏掉任何一个,结果就不是你想要的那“唯一”了。










