awkを使用してYAMLメタデータチャンクを抽出する方法

awkを使用してYAMLメタデータチャンクを抽出する方法

上部にはYAMLメタデータブロックを含むMarkdownファイルがいくつかあります。

---
title: title of work
author: author name
author-sort: name, author
published: N
date: XXXX-XX-XX
pub-number: XXXXX
embedded-title: false
---

**title**

a piece of indertimate  
length that could be a few lines of many hundreds

---[author name](author link)
---found in [source](source link)

私はメタデータの塊を抽出する方法を見つけようとしています(それでそれを供給することができますが、後でyamllint他のものを供給することもできます)。 awkが適切なツールのようですが、awkを理解していないので、私が思いついた最高のものは次のとおりです。

awk '/^---$/ {printline = 1; print; next} /^---$/ {printline = 0} printline'

これはファイル全体を示しています。---ファイルを自分の行に制限する試みは機能しません(ここに他の行がない可能性があります)!

ベストアンサー1

sedより良いツールを選択することができます。常にファイルの先頭にあるので、sedこの行から2行目のみを---印刷するように指定してから、その行を削除できます。

例えば

sed -n '2,/^---$/ {/^---$/d; p}'

これは次のように達成されます。

-n: don't print by default
2,/^---$/ { ... }: limit the next part to the lines between line 2 and the first line matching ---

その後、そのブロック内で

/^----$/d : delete the --- line
p : print what remains.

したがって、テストファイルの出力は次のようになります。

title: title of work
author: author name
author-sort: name, author
published: N
date: XXXX-XX-XX
pub-number: XXXXX
embedded-title: false

これにはawkトレース状態が必要です。例えば

awk '
/^---$/ && printline==0 {printline = 1;next}
/^---$/ {printline = 2; next}
{ if (printline==1) { print } }
'

---ファイルの残りの部分に行がある場合は、この状態が必要です。

おすすめ記事