JSONドキュメントで提供されている環境変数の値を更新する方法

JSONドキュメントで提供されている環境変数の値を更新する方法

次のJSONファイルを入力として使用する必要があり、ファイルに複数の変数エントリを含めることができます。環境変数をvar1検索しvar2、以下のJSONの値を置き換える必要があります。

{
  "var1": "valueplaceholder",
  "var2": "valueplaceholder"
}

私は次のコマンドを試しました

cat input.json | sed "s/\"\([A-Z0-9_]*\)\":\s*\"\([A-Za-z0-9_]*\)\"/\"\1\": \"$\1\"/g"

ただし、次の出力が生成されます。

{
  "var1": "$var1",
  "var2": "$var2"
}

変数の値を取得するには?つまり、$var1textの値を変更する必要があります$var1

答え1

与えられた

$ cat file.json
{ "var1": "valueplaceholder", "var2": "valueplaceholder", "var3": "valueplaceholder" }

その後、with_entries構造を借りてjqを使ってオブジェクトのキーと値を交換するには?そしてjqの$ENV配列を使用してください。

$ export var1="foo" var2="bar"
$ jq 'with_entries( .value = $ENV[.key] )' file.json
{
  "var1": "foo",
  "var2": "bar",
  "var3": null
}

または、一致しない変数を空の文字列に設定したり、元の値を保持したい場合

$ jq 'with_entries( .value = ($ENV[.key] // "") )' file.json
{
  "var1": "foo",
  "var2": "bar",
  "var3": ""
}

または

$ jq 'with_entries( .value = ($ENV[.key] // .value) )' file.json
{
  "var1": "foo",
  "var2": "bar",
  "var3": "valueplaceholder"
}

または必要に応じて削除存在しないキー

$ jq 'with_entries( .value = ($ENV[.key] // empty) )' file.json
{
  "var1": "foo",
  "var2": "bar"
}

関連情報