yq で Markdown の front matter を修正する
最近 Obsidian を使っていることもあり、 yq を使って Markdown の front matter を修正したり、あれこれすることが多くなったのでメモを残しておく。
そもそも front matter とは
例えば、以下のような Markdown の front matter があるとすると、 ---
で囲まれた部分を front matter と呼ぶ。
jekyll などで利用されていたりするもので、 Obsidian でも利用されている。
see also https://jekyllrb.com/docs/front-matter/
---
title: "title"
categories: [ "a", "b", "c" ]
date: "2025-05-07"
tags:
- "a"
- "b"
- "c"
---
SOME TEXT
SOME MORE TEXT
操作方法
Front Matter | yq にもある通り、 --front-matter=extract
or --front-matter=process
のオプションを付与することで既存の yq の操作を front matter に対して実行することができる。
extract
と process
の違いは、ドキュメントにもある通りで front matter のみを出力対象にする場合には extract
を設定し、ドキュメント全体を出力する際には process
を付与するという違いとのこと。
取得
$ yq --front-matter=extract '.title' "Sample.md"
title
$ yq --front-matter=extract '.tags[] | select(. == "a")' "Sample.md"
a
ちなみに上記のコマンドは 2025/05/07 現在の v4.44.5
を利用している限りでは、取得などに関しては実は --front-matter=process
をつけなくても front matter に対して操作できるようである。
内部実装はわからないがおそらくファイル全体から不要な部分を省略などして適用しているのかもしれない。
また、取得に関しては意図的なのかは不明だが、 --front-matter=process
を付与すると途中のみが出力されるようなので注意が必要である。
$ yq --front-matter=process '.tags[] | select(. == "a")' "Sample.md"
a
---
SOME TEXT
SOME MORE TEXT
更新
他にも更新や削除をする際には以下のようにできる
$ yq --front-matter=process '.title="updated title"' "Sample.md"
---
title: "updated title"
categories: ["a", "b", "c"]
date: "2025-05-07"
tags:
- "a"
- "b"
- "c"
---
yq
は -i
というオプションを付与することでそのファイルに変更を適用することができるので、以下のようなコマンドで Sample.md
に出力内容 (つまり変更) を適用することが可能。
※ つまり extract
を使ってしまうと一部の内容のみで上書きしてしまうので注意が必要。
$ yq --front-matter=process '.title="updated title"' "Sample.md" -i
削除
他にも以下のようなコマンドで特定の front matter を削除することもできる。
$ yq --front-matter=process 'del(.categories)' "Sample.md" -i