外部依存関係なしでbashでyamlファイルを変更する

外部依存関係なしでbashでyamlファイルを変更する

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_namemicspeaker

%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パーサーは入力構文にエラーを発生させます。

おすすめ記事