Saya membuat file JSON (input.json) yang terlihat seperti ini:

[
  {
    "name": "MINIMUM_NOTICE_PERIOD",
    "value": "3"
  },
  {
    "name": "SERVER_TIMEZONE",
    "value": "Europe/London"
  }
]

Saya memiliki file JSON yang ada (task.json) yang merupakan definisi tugas AWS ECS yang terlihat seperti ini:

{
  "family": "test-container",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "cpu": 0,
      "image": "test-image",
      "name": "test-container",
      "environment": [
          {
            "name": "CRON",
            "value": "no"
          },
          {
            "name": "LOG_CHANNEL",
            "value": "stack"
          }
        ]
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}

Saya mencoba memasukkan nilai ekstra dari file JSON (input.json) ke dalam file tugas def json (task.json)

Saya menggunakan perintah:

jq --argjson envVars "$(<input.json)" '.containerDefinitions[0].environment += [$envVars]' task.json > new-task.json

Semua berjalan dengan baik sampai akhir ketika hasilnya adalah:

{
  "family": "test-container",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "cpu": 0,
      "image": "test-image",
      "name": "test-container",
      "environment": [
        {
          "name": "CRON",
          "value": "no"
        },
        {
          "name": "LOG_CHANNEL",
          "value": "stack"
        },
        [
          {
            "name": "MINIMUM_NOTICE_PE",
            "value": "3"
          },
          {
            "name": "SERVER_TIMEZONE",
            "value": "Europe/London"
          }
        ]
      ]
    },
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}

Itu memasukkan konten lengkap file termasuk membuka dan menutup [] ke dalam array yang ada, saya bertujuan untuk sesuatu yang lebih seperti ini:

{
  "family": "test-container",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "cpu": 0,
      "image": "test-image",
      "name": "test-container",
      "environment": [
        {
          "name": "CRON",
          "value": "no"
        },
        {
          "name": "LOG_CHANNEL",
          "value": "stack"
        },
        {
          "name": "MINIMUM_NOTICE_PE",
          "value": "3"
        },
        {
          "name": "SERVER_TIMEZONE",
          "value": "Europe/London"
        }
      ]
    },
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}

Saya juga sudah mencoba perintah:

jq '.containerDefinitions[0].environment += $inputs' task.json --slurpfile inputs input.json

Menjalankan ini memberikan hasil JSON yang sama.

Saya telah mencoba menghapus tanda kurung dari file inpur.json tetapi hal itu menghasilkan kesalahan berikut dari kedua perintah jq:

jq: invalid JSON text passed to --argjson
jq: Bad JSON in --slurpfile inputs input.json

Adakah yang tahu bagaimana cara mendapatkan output yang saya cari? Bantuan apa pun diberikan karena saya telah menarik rambut saya mencoba mencari tahu bagian terakhir ini.

0
user1488220 12 Mei 2021, 18:54

2 jawaban

Jawaban Terbaik

Input.json sudah menjadi array, jadi filter jq Anda bisa sesederhana:

.containerDefintions[0].environments += $envVars

Menggunakan --slurpfile memiliki efek membungkus konten file dalam sebuah array, jadi percobaan kedua Anda harus melibatkan $inputs[0].

Karena input.json sudah menjadi file, saya sarankan menggunakan --argfile (meskipun secara resmi tidak digunakan lagi); atau, dengan sedikit lebih banyak pekerjaan, Anda dapat menggunakan doa di sepanjang baris jq ... input.json task.json

0
peak 12 Mei 2021, 16:35

Pada akhirnya peak menyarankan cara yang benar menggunakan $inputs[0] dengan --slurpfile berhasil.

0
abundantmussel 12 Mei 2021, 19:09