能否用sed一次性完成Markdown Frontmatter的增删改操作?
整合sed中Frontmatter的多操作(删除、替换、追加)
你当前用sed处理Markdown笔记的Frontmatter时,已实现替换和追加的批量整合,但删除操作无法限定在Frontmatter范围内,也没法和其他操作整合到一条命令里。之前尝试的命令因语法错误无法运行,下面是正确的实现方式:
正确的整合命令
sed -i.bak \ -e '/---/,/---/{/heading: accordion/d}' \ -e '/---/,/---/{/^meta:$/d}' \ -e '/---/,/---/{/^ path:?$/d}' \ -e '/---/,/---/s/ creation/__dc/' \ -e '/---/,/---/s/ revision/__dc/' \ -e '/---/,/---/s/ copyright/__cr/' \ -e '/__cr/a\__vs: 6' \ *.md
语法说明
- 每个删除操作必须通过
-e选项声明,用{}将Frontmatter范围(/---/,/---/)和删除动作绑定,确保仅在Frontmatter区间内匹配指定行并删除,避免误删文档其他部分的内容。 - 替换操作保持原有写法即可,已通过
/---/,/---/限定了作用范围。 - 追加操作
/__cr/a\__vs: 6只会匹配Frontmatter内的行(因为__cr是替换后仅存在于Frontmatter的标识),无需额外限定范围。
优化版本(减少重复扫描)
可以将所有Frontmatter内的操作合并到同一个范围块中,提升执行效率:
sed -i.bak \ -e '/---/,/---/{ /heading: accordion/d /^meta:$/d /^ path:?$/d s/ creation/__dc/ s/ revision/__dc/ s/ copyright/__cr/ }' \ -e '/__cr/a\__vs: 6' \ *.md
错误原因说明
你之前尝试的命令写法'/---/,/---/ /heading: accordion/d'属于sed语法错误,sed不支持这种连续的模式拼接,必须用{}将范围内的具体动作包裹起来,才能正确关联范围和操作。
内容的提问来源于stack exchange,提问作者FrViPofm
相关产品推荐
相关产品推荐

