Sublime Text如何运用正则表达式进行文本去重操作?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1099个文字,预计阅读时间需要5分钟。
Sublime Text 本身没有删除重复行的原生命令,所谓的去重功能需要依赖排序、正则或正则预查、替换等操作来实现,否则容易出现漏删、误删、卡死等问题。
Sort Lines: Unique 是最省事的整行去重方式(Sublime 4.4+)
如果你用的是 Sublime Text 4.4 或更新版本(比如当前 4.4.1),直接全选文本后调出命令面板 Ctrl+Shift+P,输入 Sort Lines: Unique 回车即可——它内部等价于 sort -u,自动排序 + 合并相邻重复,保留每组首次出现的行。
这个命令不依赖正则、不卡顿、不报错,但有两个硬限制:
- 它只处理「整行完全一致」的重复,哪怕末尾多一个空格或换行符不统一(
\r\nvs\n),就判为不同行 - 原始顺序会被打乱,代码、日志、带时间戳的文本慎用
保序去重必须用 ^(.*$)\n(?=.*^\1$) 配合 . matches newline
想删掉重复行但保留第一处(比如清理 import 列表或配置项),就得用这个正则。它靠向后预查((?=.*^\1$))判断某行是否在后续还会出现,只删那些「后面还有相同行」的实例。
关键操作步骤:
- 先统一换行符:
File → Line Endings → Unix(避免\r\n干扰^和$的行为) - 打开替换面板
Ctrl+H,勾选Regular Expression(点.*图标)和. matches newline(点右下角.按钮或按Alt+R) - 查找框填:
^(.*$)\n(?=.*^\1$),替换框留空 - 点
Replace All—— 注意:第一次可能没清完,多点一次更保险
这个正则在大文件(>5MB)里容易卡,如果卡住,说明文本含零宽字符、BOM 或混合编码,建议先用 ^[ \t]*$ 清空行、[ \t]+$ 清行尾空白,再试。
连续重复行用 ^(.*$)\n^\1$ 更安全(不需 . matches newline)
当你已经排好序(比如用 Sort Lines),重复行必然紧邻,这时用 ^(.*$)\n^$ 最稳——它不跨段、不预查、不依赖 . 匹配换行,兼容性最好,连老版本 Sublime 3 都能跑。
使用前提和风险点:
- 必须先全选 +
Sort Lines,否则只删掉像apple\napple这种紧挨着的,漏掉中间隔了别的行的重复 - 匹配后替换为空,会删掉第二行(即保留首行),但若三连重复(
a\na\na),第一次只删第二个a,得点两次Replace All - 别用
^\1而不是^\1$——少了$可能匹配到部分重叠(如abc和abcd)
为什么 Remove Duplicate Lines 插件经常失效?
这个插件(以及很多类似命令)底层逻辑只是「逐行比对上一行」,不是建哈希表全局扫描。所以它面对这样的文本:
apple banana apple
完全不会删第三行,因为它的上一行是 banana,不是 apple。它只对连续重复有效,且对大小写、BOM、行尾空格、零宽字符(U+200B)极度敏感。
真正要保序 + 全局去重,只有两个靠谱路径:
- 用内置 Python 控制台跑脚本(适合 >10 万行或需按列去重)
- 用
Filter Lines插件(Package Control 安装后,命令面板搜Filter Lines: Unique,它比原生命令更鲁棒)
别指望一个正则或一个插件通吃所有场景——重复行是否相邻、是否保序、是否含不可见字符,决定了你该切哪条路。
本文共计1099个文字,预计阅读时间需要5分钟。
Sublime Text 本身没有删除重复行的原生命令,所谓的去重功能需要依赖排序、正则或正则预查、替换等操作来实现,否则容易出现漏删、误删、卡死等问题。
Sort Lines: Unique 是最省事的整行去重方式(Sublime 4.4+)
如果你用的是 Sublime Text 4.4 或更新版本(比如当前 4.4.1),直接全选文本后调出命令面板 Ctrl+Shift+P,输入 Sort Lines: Unique 回车即可——它内部等价于 sort -u,自动排序 + 合并相邻重复,保留每组首次出现的行。
这个命令不依赖正则、不卡顿、不报错,但有两个硬限制:
- 它只处理「整行完全一致」的重复,哪怕末尾多一个空格或换行符不统一(
\r\nvs\n),就判为不同行 - 原始顺序会被打乱,代码、日志、带时间戳的文本慎用
保序去重必须用 ^(.*$)\n(?=.*^\1$) 配合 . matches newline
想删掉重复行但保留第一处(比如清理 import 列表或配置项),就得用这个正则。它靠向后预查((?=.*^\1$))判断某行是否在后续还会出现,只删那些「后面还有相同行」的实例。
关键操作步骤:
- 先统一换行符:
File → Line Endings → Unix(避免\r\n干扰^和$的行为) - 打开替换面板
Ctrl+H,勾选Regular Expression(点.*图标)和. matches newline(点右下角.按钮或按Alt+R) - 查找框填:
^(.*$)\n(?=.*^\1$),替换框留空 - 点
Replace All—— 注意:第一次可能没清完,多点一次更保险
这个正则在大文件(>5MB)里容易卡,如果卡住,说明文本含零宽字符、BOM 或混合编码,建议先用 ^[ \t]*$ 清空行、[ \t]+$ 清行尾空白,再试。
连续重复行用 ^(.*$)\n^\1$ 更安全(不需 . matches newline)
当你已经排好序(比如用 Sort Lines),重复行必然紧邻,这时用 ^(.*$)\n^$ 最稳——它不跨段、不预查、不依赖 . 匹配换行,兼容性最好,连老版本 Sublime 3 都能跑。
使用前提和风险点:
- 必须先全选 +
Sort Lines,否则只删掉像apple\napple这种紧挨着的,漏掉中间隔了别的行的重复 - 匹配后替换为空,会删掉第二行(即保留首行),但若三连重复(
a\na\na),第一次只删第二个a,得点两次Replace All - 别用
^\1而不是^\1$——少了$可能匹配到部分重叠(如abc和abcd)
为什么 Remove Duplicate Lines 插件经常失效?
这个插件(以及很多类似命令)底层逻辑只是「逐行比对上一行」,不是建哈希表全局扫描。所以它面对这样的文本:
apple banana apple
完全不会删第三行,因为它的上一行是 banana,不是 apple。它只对连续重复有效,且对大小写、BOM、行尾空格、零宽字符(U+200B)极度敏感。
真正要保序 + 全局去重,只有两个靠谱路径:
- 用内置 Python 控制台跑脚本(适合 >10 万行或需按列去重)
- 用
Filter Lines插件(Package Control 安装后,命令面板搜Filter Lines: Unique,它比原生命令更鲁棒)
别指望一个正则或一个插件通吃所有场景——重复行是否相邻、是否保序、是否含不可见字符,决定了你该切哪条路。

