必须分类型分场景处理:先用正则[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]清C0控制字符(保留\n\t),再单独搜\r$删行尾\r,最后用xxd和py_compile验证字节洁净与语法正确。

Sublime 里代码字符清理不是“一键全删”,而是按字符类型分场景处理:控制字符必须先清,行首/行尾空格要看缩进安全,空行要防误删,中文字符得用 Unicode 范围——混着来必出错。
怎么清除 ^M、\x00 这类导致 Python 报错的控制字符
这些不是空格,是真实字节:\r(显示为 ^M)在 Unix 环境下会引发 SyntaxError: invalid byte sequence,\x00 直接让解释器卡在字节流解析阶段。靠肉眼或删空格根本没用。
- 打开
Ctrl+H→ 勾选右下角.*(正则模式) - 查找框输入:
[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]—— 它清除所有 C0 控制字符,但保留\n(\x0a)和\t(\x09),不破坏换行和缩进 - 替换框留空,点
Replace All - 再单独处理行尾
\r:查找\r$,替换成空 —— 这步专治 Windows 换行残留 - 验证是否真干净:终端执行
xxd test.py | head -n 5,输出里不能有00(\x00)、单独的0d(\r无0a配对)
怎么安全删行首空格和制表符,又不破坏 Python 缩进
Python 对缩进敏感,^[ \t]+ 看似简单,但一不留神就把函数体内的缩进给干掉了。必须确认当前文件缩进规则统一,且不混用空格和 Tab。
- 先按
Ctrl+Shift+P输入Indentation: Detect Indentation,让 Sublime 自动识别当前缩进方式 - 再打开
Ctrl+H→ 开正则 → 查找:^[ \t]+→ 替换留空 - 点
Find All看匹配结果:如果高亮出现在 def、if、for 等语句后(即本该缩进的位置),说明这个操作会破坏结构,别点Replace All - 若只想删注释或空行前的空白,改用
^([ \t]+)(?=#|$\n),它只匹配行首空白后紧跟#或换行的位置 - 删完立刻用
python -m py_compile test.py验证,报错就说明缩进断了
为什么 trim_trailing_white_space_on_save 设置了却没反应
这不是功能失效,而是 Sublime 的配置优先级在起作用。你写的设置可能被更高层规则覆盖,甚至 JSON 格式错误都只会静默失败。
- 必须改右侧「User」面板里的设置,不是左侧默认设置;整块内容要包在
{}里,末尾逗号不能多也不能少 - 引号必须是英文双引号,写成中文引号、单引号或漏掉大括号,整个用户设置就失效
- 检查右下角语法标识(如
source.python),它可能加载了语法专属设置,把全局配置压掉了;临时切到Plain Text测试 - .sublime-project 文件里若有
"trim_trailing_white_space_on_save": false,它会直接生效,优先级高于用户设置 - 已装
TrailingSpaces插件时,别同时开原生选项,否则光标乱跳、保存闪一下——二选一
如何批量删空行又不伤末尾换行和 Markdown 硬换行
空行清理最易翻车的地方是:删掉文件末尾多个 \n 后只剩一个,或误删 Markdown 中两个空格 + 换行构成的硬换行语义。
- 查找:
^\s*$\n——\s*匹配空格/Tab/不可见空白,\n明确吃掉换行符本身,不会波及下一行 - 别用
^\n:它漏掉含空格的“伪空行”,也容易在文件末尾多删一次导致结尾无换行 - 删完检查文件末尾:如果连续多个空行,
^\s*$\n只删到倒数第二个\n,最后一个会保留;如需彻底清空,额外跑一次\n\s*$ - Markdown 场景慎用:两个空格 +
\n是硬换行,^\s*$\n不会误删(因它要求整行只有空白),但若你手动删了那两个空格,硬换行就没了 - 验证方式:用
xxd看最后几行字节,确认没有异常00或孤立0d
真正麻烦的从来不是怎么删,而是删完之后没人验证——xxd 和 python -m py_compile 是唯二靠谱的验收手段,其他全是幻觉。











