シェルを使用したYAML部分解析

シェルを使用したYAML部分解析

私のYAMLは次のとおりです

something:
 - whatever:
   - something
 - toc: 4
 - body: assets/footer.html
pkg:
 - pkg_a_1:
   - Shass
   - AJh55
   - ASH7
 - pkg_b_1:
   - Kjs6
   - opsaa
other:
morestuff:
 - whatever

次の内容を抽出したい。パッケージ次のようにテキストファイルとして印刷します。

pkg_a_1 Shass
pkg_a_1 AJh55
pkg_a_1 ASH7
pkg_b_1 Kjs6
pkg_b_1 opsaa

このセクションだけが必要で、残りの大型YAMLファイルは必要ないため、完全なYAMLパーサーを使用しないようにします。

  • いくつかのタグ(パッケージ) は固定され、一度だけ表示され、変更されません。
  • 測定値ラベルと測定値番号(pkg_a_1pkg_b_1)を交換できます。
  • 各セクションの項目数と順序は変更されることがあります。プロジェクトに[A-Za-z0-9]+
  • 内容の前後パッケージ部品は変更されることがあります。 IEのさまざまな部分何:そして その他:存在する場合も存在しない場合もあります。

答え1

$ awk '/^[^ ]/{ f=/^pkg:/; next } f{ if (sub(/:$/,"")) pkg=$2; else print pkg, $2 }' file
pkg_a_1 Shass
pkg_a_1 AJh55
pkg_a_1 ASH7
pkg_b_1 Kjs6
pkg_b_1 opsaa

答え2

yq以下で使用https://kislyuk.github.io/yq/

yq -r '.pkg[] | to_entries[] | .key as $key | .value[] | [ $key, . ] | @tsv' file.yaml

yqこれは、YAMLデータを式を使用してjq処理できるJSON文書に変換します。

この式は、次のように項目をpkgオブジェクトセットに変換します。

{
  "key": "pkg_a_1",
  "value": [
    "Shass",
    "AJh55",
    "ASH7"
  ]
}
{
  "key": "pkg_b_1",
  "value": [
    "Kjs6",
    "opsaa"
  ]
}

これらの各オブジェクトの配列はvalue繰り返され、key現在の配列はvalue演算子を使用してタブ区切りリストに変換されます@tsv

質問のデータを考慮すると、最終出力はタブ区切りのリストです。

pkg_a_1 Shass
pkg_a_1 AJh55
pkg_a_1 ASH7
pkg_b_1 Kjs6
pkg_b_1 opsaa

答え3

Mike Farrarの製品を選択することもできます。yq、そしてjq

yq -j r infile.yml 'pkg.*' |
jq -r 'to_entries[] | .key as $k | .value | map(. = $k + " " + .) | join("\n")'

出力:

pkg_a_1 Shass
pkg_a_1 AJh55
pkg_a_1 ASH7
pkg_b_1 Kjs6
pkg_b_1 opsaa

関連情報