YAMLファイルには複数の構成があり、Bashスクリプトを使用していくつかのパラメーターを変更する必要があります。可能ですか?外部依存関係の使用を避けたい。
私のYAMLは次のとおりです
%YAML 1.2
---
name: mic
components:
- name: Mic
parameters:
period_count: 4
alsa_device_name: "pulse"
---
name: speaker
components:
- name: Speaker
parameters:
period_duration_ms: 20
period_count: 4
alsa_device_name: "pulse"
私が提供したように動作したい場合は、私の設定で次のように--mic logitec --speaker hk34
変更する必要があります。alsa_device_name
mic
speaker
%YAML 1.2
---
name: mic
components:
- name: Mic
parameters:
period_count: 4
alsa_device_name: "logitec"
---
name: speaker
components:
- name: Speaker
parameters:
period_duration_ms: 20
period_count: 4
alsa_device_name: "hk34"
Bashだけを使用してこれを実行できますか?可能であればどのように達成できますか?今はPythonスクリプトを使用していますが、これを行うとhaveへの追加の依存関係が追加されるので、python3
これを避けたいと思います。
ベストアンサー1
まず、明確に定義された構文を持つYAMLなどの言語を解析するために行ベースのツールを使用することはお勧めできません。本番では使用しないでください!いいえ。
コマンドラインを介してYAMLを解析するためのいくつかの構文認識ツールがあります。Pythonyq
そして行くyq
。これは、標準行ベースのツールとして理解されていないアンカーやブロックリテラルなどのYAMLの構造をサポートします。
上記のワンタイム処理の場合は、awk
次のようなものを使用できます。
BEGIN {
map["name: mic"] = "\"logitec\""
map["name: speaker"] = "\"hk34\""
}
match($0, "name: mic") || match($0, "name: speaker") {
key = substr($0, RSTART, RLENGTH)
}
/alsa_device_name/ {
sub(/:.*/, ": " map[key])
}
{ print }
awk
上記の内容をスクリプト(.awk
)に入れて、awk -f script.awk yaml
コマンドラインの一部として実行できます。コマンドラインで値を次のように定義することもできます。
awk -v mic='"logitec"' -v speaker='"hk34"' -f script.awk yaml
ブロックのパラメータを次BEGIN
のように処理します。
BEGIN {
map["name: mic"] = mic
map["name: speaker"] = speaker
}
また、入力は有効なYAMLファイルではなく、ヘッダー行のため、%YAML 1.2
ほとんどの標準YAMLパーサーは入力構文にエラーを発生させます。