私の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_1、pkg_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