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