Notepad++批量处理依赖Ctrl+H(仅已保存打开文件)、Ctrl+Shift+F(磁盘级修改,需绝对路径和英文分号过滤器)、宏录制(仅当前标签页,适合确定性操作);必须开启“显示所有字符”排查换行符、BOM、不可见字符等底层问题。

Notepad++ 本身没有“项目级批量处理”功能,所有跨文件操作都依赖三个入口:Ctrl+H(全部文档)、Ctrl+Shift+F(磁盘扫描)、宏录制。用错入口,90% 的失败都是静默跳过,不报错也不提示。
Ctrl+H 勾选「全部文档」只改已保存的打开文件
这个操作看似最直接,但限制最多:所有目标文件必须已保存、有真实路径、且当前处于打开状态。未保存的标签页(标题带 * 号)会被完全忽略,哪怕你点了「全部文档」也无济于事。
- 执行前先确认:右下角状态栏显示的是「UTF-8」还是「ANSI」?若目标文件是 UTF-8,而当前界面显示 ANSI,替换中文会变成 ???
- 「全部文档」不是「全部打开的文档」——它只作用于当前 Notepad++ 实例中所有已保存的标签页,不包括后台最小化的窗口
- 替换后不会自动保存,必须手动 Ctrl+S 或启用「在查找/替换后自动保存文件」插件(如 PythonScript + 自定义脚本)
- 适合场景:你已经用
"C:\Program Files\Notepad++\notepad++.exe" -r *.log递归打开了几十个日志文件,现在要统一删掉某类调试行
Ctrl+Shift+F 是唯一真正修改磁盘文件的入口
这是唯一绕过标签页、直接读写磁盘文件的方式。但它不是“智能扫描”,而是严格按你填的路径 + 过滤器 + 编码三者闭环执行。漏一环,就 0 occurrence(s) found。
-
目录字段必须填绝对路径,C:\myapp\src有效,./src、src/、留空都无效 -
文件过滤器必须用英文分号分隔,*.js;*.ts;*.html正确,*.js, *.ts或*.js *.ts完全失效 - 勾选「包括子文件夹」才递归;不勾选=只查你填的那个目录一层
- 正则模式下反向引用必须用
$1,\1不生效;$0表示整个匹配项 - 若文件混用编码(如部分 UTF-8、部分 GBK),Notepad++ 会按各文件原始编码读取,但统一用右下角当前编码解析查找内容——结果就是“明明有却找不到”
宏录制适合重复结构化编辑,不适合模糊匹配
宏不是正则,它记录的是光标移动、按键输入、菜单点击等原子操作。适合「每行开头加 #」「删掉第 3 列」「把光标所在行复制到下一行末尾」这类确定性动作,不适合「删掉所有含 TODO 的注释行」这种需判断逻辑的场景。
- 宏存放在
shortcuts.xml中,路径取决于安装类型:%APPDATA%\Notepad++\shortcuts.xml(安装版)或同级shortcuts.xml(便携版) - 录制时若包含鼠标拖动、Alt+鼠标列选等操作,回放可能偏移——建议全程用键盘(方向键、Home/End、Ctrl+←→)控制光标
- 宏不跨文件执行:一个宏只能作用于当前激活标签页;想批量跑,得先用 Ctrl+Shift+F 打开一批文件,再逐个切标签运行宏,或配合 PythonScript 插件循环调用
- 安全做法:先对单个文件测试宏,确认行为符合预期,再批量应用
最容易被忽略的底层细节:换行符、BOM、空格不可见字符
这些不是“高级技巧”,而是批量失败的第一道门槛。Notepad++ 默认不显示它们,但它们决定正则是否跨行、空行是否被识别、中文是否乱码。
- 开启「视图 → 显示符号 → 显示所有字符」,立刻看到
CRLF、空格点(·)、制表符(→),否则你写的^$可能根本匹配不到“空行”,因为那行其实有空格或制表符 - 正则跨行匹配必须勾选「. 匹配换行符」,且模式选「正则表达式」;扩展模式(
\r\n)不支持$1,也不支持.跨行 - BOM(
\xEF\xBB\xBF)在 UTF-8 文件开头,肉眼不可见,但会影响某些构建工具;误删 BOM 后,Notepad++ 可能把文件识别为 ANSI,后续所有替换都会乱码 - 从网页、Excel 复制进来的文本常含全角空格、零宽空格(
\u200B),普通正则\s匹配不到,得显式写[\s\u200B]











