jq + jsonファイルを更新し、ID番号に応じて名前を追加します

jq + jsonファイルを更新し、ID番号に応じて名前を追加します

次のルールに従ってjsonファイルを編集します

car0X_hyb.com 名前の下の文字列を生成する必要がありますmazda (XはID番号です)

Linuxマシン上のjsonファイルを更新する必要があります

例 - ID=1

jsonは次のようになります

{
  "toyota": [
    "car1.com"
  ],
  "mazda": [
    "car01_hyb.com"
  ],
  "ford": [
    "car01_eng.com"
  ]
}

ID=4するとjsonは次のようになります

{
  "toyota": [
    "car1.com"
  ],
  "mazda": [
    "car01_hyb.com",
    "car02_hyb.com",
    "car03_hyb.com",
    "car04_hyb.com"
  ],
  "ford": [
    "car01_eng.com"
  ]
}

ID=6するとjsonは次のようになります

{
  "toyota": [
    "car1.com"
  ],
  "mazda": [
    "car01_hyb.com",
    "car02_hyb.com",
    "car03_hyb.com",
    "car04_hyb.com",
    "car05_hyb.com",
    "car06_hyb.com"
  ],
  "ford": [
    "car01_eng.com"
  ]
}

ID=10するとjsonは次のようになります

{
  "toyota": [
    "car1.com"
  ],
  "mazda": [
    "car01_hyb.com",
    "car02_hyb.com",
    "car03_hyb.com",
    "car04_hyb.com",
    "car05_hyb.com",
    "car06_hyb.com",
    "car07_hyb.com",
    "car08_hyb.com",
    "car09_hyb.com",
    "car10_hyb.com"
  ],
  "ford": [
    "car01_eng.com"
  ]
}

答え1

IDをゼロ埋めする醜くない方法はないようだ。しかし、

$ jq '.' file.json
{
  "toyota": [
    "car1.com"
  ],
  "mazda": [
    "foo.bar"
  ],
  "ford": [
    "car01_eng.com"
  ]
}

たとえばID=の場合11:

$ jq --arg ID 11 '
    .mazda |= [range(1;($ID | tonumber)+1) as $ID | if $ID < 10 then "car0\($ID)_hyb.com" else "car\($ID)_hyb.com" end]
' file.json
{
  "toyota": [
    "car1.com"
  ],
  "mazda": [
    "car01_hyb.com",
    "car02_hyb.com",
    "car03_hyb.com",
    "car04_hyb.com",
    "car05_hyb.com",
    "car06_hyb.com",
    "car07_hyb.com",
    "car08_hyb.com",
    "car09_hyb.com",
    "car10_hyb.com",
    "car11_hyb.com"
  ],
  "ford": [
    "car01_eng.com"
  ]
}

または (おそらくこれがより良いでしょう)、シェルで完全な文字列要素を生成してフォーマットし、それを として渡しますargjson

jq --argjson IDS '['"$(seq -s, -f'"car%02.0f_hyb.com"' 11)"']' '
  .mazda |= $IDS
' file.json

関連情報