比如我之前的 a 属性的值是 bbb,现在我想全部换成 ccc。
a 是列表属性。
Linter 好像没有这个功能?
这个需求太小了,估计没有解决这种需求的插件
可以考虑通过在控制台运行一行命令
app.vault.getFiles().forEach(f=>app.fileManager.processFrontMatter(f,fm=>{if(Array.isArray(fm['a'])&&fm['a'].includes("bbb")){fm['a']=fm['a'].toSpliced(fm['a'].indexOf('bbb'),1,'ccc')}}))
来解决问题
要不要用外部工具……比如我现在会用Trae,直接让他进行操作就行了
换个思路,先删除属性a,再增加属性a,值为ccc
有个批量增减属性插件 Multi Properties
后续步骤,使用 linter 排序好 属性的顺序(Multi 默认会将属性加载最后),执行 linter
得益于OB本地存储纯文本,随便一个 高级文本编辑器 就可以实现你的需求,搜索替换 即可。
个人习惯用 VSCode,过滤(指定)文件夹、文件类型,还有正则这些都挺方便的。
如果修改的文件超级多,建议关闭OB,修改完之后再重启OB,重启OB后一般会重建索引,避免索引异常!
如果用正则表达式搜索替换,写出的正则表达式容易出错,并且还不方便维护
比如使用正则表达式 ^---$([\s\S]*)^a:\n([^:]*)^\s{2}-\s(bbb|"bbb")$ 来搜索替换成 ---$1a:\n$2 - "ccc",虽然可以解决问题,但不够优雅
总之,我认为是更好的解决方案是去写一个 JavaScript 脚本调用 Obsidian API 来批量更改,而不是去通过正则表达式搜索替换
有没有成熟的 js 脚本呀?
初始需求只是修改值 → 弄一个通用JS(正则)? → 弄一个插件?
haha~,你这正则一写不懂的直接劝退,我感觉楼主的需求不用那么复杂,普通 搜索替换 应该就可以了,文件不多手动取消非yaml内的关键字内容即可!
利用Bases!操作和excel一样。
- 建立全库的Bases,表格视图
- 显示要改的属性a,并排序(便于一次性选中)
- 一次性选中所有要改的属性值
bbb,并复制到txt文档或excel中 - 在文档中替换
bbb为ccc后,复制全部值 - 回到Bases,ctrl+v粘贴新值即可
以上是修改a的属性从 bbb 为 ccc
补充:如果要修改a属性从 bbb 变为bbb,ccc ,复制新属性值时,只复制一个 ccc,然后在Bases中,选中所有 bbb 并粘贴。区别就在复制的数量。
注意操作前备份!!!
棒,好方法。。。
