jq는 json 파일 내에서 "[]" 블록을 검색하고 바꿉니다.

jq는 json 파일 내에서 "[]" 블록을 검색하고 바꿉니다.

run_list사이에 있는 값을 제거 []하고 에서 정의한 변수로 바꿔야 합니다 a.

실행 목록:

{
  "name": "blah200.blah.stage.blahblah.com",
  "chef_environment": "blahenv",
  "run_list": [
  "recipe[blah1]",
  "recipe[blah2]",
  "recipe[blah3]",
  "recipe[blah4]",
  "recipe[blah5]",
  "recipe[blah6]",
  "recipe[blah7]",
  "recipe[blah8]",
  "recipe[blah9]"
]
,
  "normal": {
    "tags": [
      "run_once"
    ],
    "selinux": {
      "status": "disabled"
    },
    "blah_pkger": {
      "access": {
        "blah": "x.x.x.x"
      }
    }
  }
}
a="[ recipe[blah11], recipe[blah12], recipe[blah12], recipe[blah13], recipe[blah14], recipe[blah15], recipe[blah16], recipe[blah17], recipe[blah18], recipe[blah19], recipe[blah20], recipe[blah21], recipe[blah22], recipe[blah23] ]"

나는 내가 다음과 같은 일을 할 수 있다는 것을 안다.

jq --args newval $a '(.run_list[]| select(.run_list))|= $newval' file.json > tmp.json

하지만 다음 오류가 발생하지 않습니다.

jq: error: syntax error, unexpected $end (Unix shell quoting issues?) at <top-level>, line 1:

답변1

새 배열 요소가 다음과 같은 셸 배열에 있다고 가정합니다.

a=(
        'recipe[blah11]' 'recipe[blah12]' 'recipe[blah12]' 'recipe[blah13]'
        'recipe[blah14]' 'recipe[blah15]' 'recipe[blah16]' 'recipe[blah17]'
        'recipe[blah18]' 'recipe[blah19]' 'recipe[blah20]' 'recipe[blah21]'
        'recipe[blah22]' 'recipe[blah23]'
)

run_list그런 다음 배열을 다음과 같은 요소로 바꿀 수 있습니다 .

jq '.run_list = $ARGS.positional' file --args "${a[@]}"

...문서가 저장되는 곳입니다 file.

옵션 --args은 명령줄의 마지막 옵션이어야 하며 jq배열은 그 뒤에 개별적으로 인용된 문자열로 확장됩니다. 표현식 내에서 jq이러한 문자열은 배열로 사용 가능하며 $ARGS.positional이 배열을 문서의 올바른 위치에 할당하기만 하면 됩니다.

스칼라 셸 변수에 유효한 JSON 배열로 새 값을 전달하는 경우

a='[
  "recipe[blah11]", "recipe[blah12]", "recipe[blah12]", "recipe[blah13]",
  "recipe[blah14]", "recipe[blah15]", "recipe[blah16]", "recipe[blah17]",
  "recipe[blah18]", "recipe[blah19]", "recipe[blah20]", "recipe[blah21]",
  "recipe[blah22]", "recipe[blah23]"
]'

그럼 넌 할 수 있어

jq --argjson value "$a" '.run_list = $value' file

값을 문자열로 인코딩하는 대신 JSON 문서 조각 으로 사용 --argjson하려면 여기에서 사용해야 합니다 .jq$a

관련 정보