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 に対して実行することができる。

extractprocess の違いは、ドキュメントにもある通りで 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

参考