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

관련 정보