Obsidian 批量调高标题级别,H3 变 H2,H4 变 H3
在 Obsidian 中批量调整标题级别,最快且最稳妥的方法是使用 正则表达式 (Regex) 进行替换。你可以根据你的操作习惯选择以下两种方式:
方法一:使用内置搜索替换(针对单个文件)
如果你只想修改当前打开的文档,按下 Ctrl + H (Windows) 或 Cmd + Alt + F (Mac) 打开替换面板:
- 开启正则模式 :确保搜索栏右侧的
.*图标已点亮。 - 查找内容 :
^### (.*)$- 解释:匹配以三个 # 开头的行。
- 替换内容 :
## $1- 解释:将三个 # 替换为两个,并保留后面的文字内容。
- 执行 :点击“全部替换”。
注意 :执行时请遵循**“从高到低”** 的顺序。先将 H3 变 H2,再将 H4 变 H3。如果你反过来(先 H4 变 H3),那么原本的 H4 最终会由于连续匹配变成 H2。
方法二:使用全局插件(针对整个仓库)
如果你需要跨文件批量修改,推荐使用 Global Search and Replace 插件或强大的 Apply Patterns 插件。
使用通用正则表达式逻辑:
为了安全起见,建议使用以下捕获组规则,它可以更精确地识别标题:
| 目标操作 | 查找正则 (Find) | 替换为 (Replace) |
|---|---|---|
| H3 → H2 | ^###\s+(.*) |
## $1 |
| H4 → H3 | ^####\s+(.*) |
### $1 |
方法三:自动化脚本(针对重度自动化用户)
既然你熟悉 QuickAdd 或 Templater ,可以编写一个简单的 JavaScript 脚本来处理选中的文本:
JavaScript
// 示例逻辑:将选中内容的标题级别整体调高一级
let selection = tp.file.selection();
let updated = selection.replace(/^#(#+)\s/gm, (match, p1) => {
return "#".repeat(p1.length) + " ";
});
// 替换当前选中的内容
💡 小贴士
- 备份先行 :在进行大规模正则替换前,建议先备份你的笔记库。
- 空格检查 :确保你的标题符合标准 Markdown 格式(
#后必须带一个空格)。上面的正则\s+已经考虑到了这一点。
如果你有更复杂的结构(比如需要一次性把 H2-H6 全部向上提一级),需要我帮你写一个完整的循环替换脚本吗?
写一个完整的循环替换脚本
既然你已经习惯了在 Obsidian 中使用 QuickAdd 或 Templater 处理自动化流,我们可以编写一个更加稳健的 JavaScript 脚本。
这个脚本逻辑的核心在于: 逆序处理标题级别 。这样可以避免“H4 变成 H3 后,在同一轮循环中又被误判为原本的 H3 变成了 H2”的问题。
核心逻辑设计
我们将脚本设定为:扫描选中的文本,识别所有的 Markdown 标题,并将它们的 # 数量减一(最低减至 H1)。
脚本代码 (适用于 QuickAdd 或 Templater)
你可以将以下代码放入 QuickAdd 的 Capture 脚本或 Templater 的脚本文件中:
JavaScript
<%*
// 获取当前活动的 Markdown 视图
const activeView = app.workspace.getActiveViewOfType(tp.obsidian.MarkdownView);
if (activeView) {
const editor = activeView.editor;
const selection = editor.getSelection();
if (!selection) {
new tp.obsidian.Notice("⚠️ 请先选中一段包含标题的文字");
return;
}
// 分行处理
const lines = selection.split('\n');
// 遍历每一行进行替换
const newLines = lines.map(line => {
// 匹配 2 到 6 个 # 开头的标题
return line.replace(/^(#{2,6})\s+(.*)/, (match, hashes, content) => {
const newLevel = hashes.length - 1;
// 确保至少保留一个 # (即 H1)
const newHashes = "#".repeat(Math.max(1, newLevel));
return `${newHashes} ${content}`;
});
});
// 写回编辑器并发送通知
editor.replaceSelection(newLines.join('\n'));
new tp.obsidian.Notice("✅ 选区标题级别已调高");
} else {
new tp.obsidian.Notice("❌ 无法获取当前编辑器");
}
%>
脚本要点说明
- 防止“降级踩踏” :脚本使用了
#{2,6}。这意味着它会跳过一级标题(H1),因为标准 Markdown 不支持“H0”。 - 正则精确捕获 :使用
^(#{2,6})\s+(.*)确保只匹配行首的标题,而不会误伤正文中的#字符(如标签或代码块)。 - 多行兼容 :通过
split('\n')和map处理,即使选区中夹杂着普通正文,脚本也只会精准修改标题行,保持正文不动。
如何使用?
- QuickAdd 用户 :
- 创建一个新的
Macro。 - 添加一个
User Script,将上述代码粘贴进去。 - 在
Command Palette中运行该宏即可。
- 创建一个新的
- Templater 用户 :
- 将代码包裹在
<%* ... %>标签中。 - 保存为脚本模板,通过快捷键或脚本菜单触发。
- 将代码包裹在
进阶建议
- 确认选区:确保你确实手动选中了文本。
- 空格规范:检查你的 Markdown 标题
#后面是否有一个标准的空格。 - 控制台报错:按下
Ctrl+Shift+I(Windows) 或Cmd+Option+I(Mac) 打开开发者工具,查看 Console 是否有更详细的错误堆栈。
实践效果

选择一段文本,执行脚本,标题自动提高一个级别。效果很好,满足需求。
一个很长的笔记,有时要拆分出一部分出来。拆分之后,新笔记的标题可能不太合适,需要调高标题级别。
Tag: #Obsidian #文本处理
文章评论