列选择模式是唯一可靠方式:按Alt(Win/Linux)或Cmd+Shift(macOS)拖选矩形区域,或用Ctrl+L→Ctrl+Shift+L→Ctrl+→→Ctrl+Shift+↓扩展光标至目标列后删除;若缩进不统一,须先Convert Indent to Spaces。

用列选择模式直接删多行同一列的制表符
Sublime 的列选择(Column Selection)是处理“竖着删”的唯一可靠方式,比如所有行第 5 列都是制表符,你想批量去掉它——正则做不到这点,因为正则按行工作,无法跨行对齐列位置。
操作步骤:
- 按住
Alt(Windows/Linux)或Cmd+Shift(macOS),鼠标从目标列顶部拖到底部,形成矩形选区 - 松手后,被选中的所有制表符高亮,直接按
Delete或Backspace - 如果行数太多拖不动:先
Ctrl+L全选所有行 →Ctrl+Shift+L拆成每行一个光标 →Ctrl+→(或方向键)把光标移到目标列 →Ctrl+Shift+↓向下扩展列选区
注意:Ctrl+Shift+↓ 扩展的是“当前光标所在列”,不是“视觉对齐列”。如果缩进不统一(比如有些行用 2 个空格、有些用 1 个 Tab),列选择会错位。此时必须先统一缩进(Ctrl+Shift+P → Indentation: Convert to Spaces)再操作。
用正则删掉每行开头的制表符(但不是“多行同一列”)
如果你实际想删的是“每行行首的制表符”,而不是“所有行第 N 列的制表符”,那属于典型行首清理场景,和列位置无关。
正确做法是启用正则,查找:^\t+,替换留空。
常见错误:
- 写成
^[\t]+:方括号多余,\t本身已是字符类,加括号反而可能被误读 - 漏掉
^:变成全局搜\t+,会误删行中或行尾的制表符 - 勾选了
. matches newline:导致^和$失效,整段文本可能被当一行处理
执行前务必先点 Find All,看右下角匹配数是否符合预期。尤其注意混合缩进文件(空格+Tab混用),^\t+ 只动 Tab,不影响空格缩进。
为什么不用 ^[ \t]+ 来“保险起见”?
^[ \t]+ 看似能同时删空格和 Tab,但它会破坏语义:比如 Python 代码里,行首空格是缩进的一部分,删掉就语法错误;而制表符可能是你特意插在注释前做对齐的。
更危险的是,它会误伤以下情况:
- YAML 文件中,
key: value前的空格是结构必需,删掉导致解析失败 - Makefile 中,命令行必须以 Tab 开头,删掉就编译报错:
Makefile:2: *** missing separator. Stop. - SQL 脚本里用空格缩进的子查询,删完变一行,可读性归零
所以,“删制表符”和“删行首空白”是两件事。明确目标再选表达式,别用“看起来更全”的写法代替思考。
大文件或项目级批量处理前必须验证
超过 5000 行时,Replace All 容易卡死甚至崩溃。不要直接全量操作。
- 先选中一个逻辑块(如一个函数、一段配置),勾选
In Selection再替换 - 用
Find in Files(Ctrl+Shift+F)查^\t+,确认只命中你预期的文件类型(比如只对.sh或.make文件生效) - 避免在 UTF-8 with BOM 文件里直接操作:BOM 字节(
\ufeff)可能干扰^锚定,建议先转为 UTF-8 without BOM
最常被忽略的一点:制表符在不同编码下显示一致,但它的字节值固定是 0x09。只要文件没损坏,^\t+ 就不会漏匹配——问题往往出在你以为它是 Tab,其实粘贴进来的是全角空格或 Unicode 分隔符。

















