다음과 같은 json 파일이 있습니다.
{ "active": "secure", "secure": { "nodetype": "secure", "nodeid": null, "servers": [ "ts2.na", "ts1.na", "ts3.na" ], "stakeaddr": null, "email": null, "fqdn": null, "ipv": "4" } }
나는 이것을 다음과 같이 바꾸고 싶습니다 :
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nicea address",
"email": "[email protected]",
"fqdn": "itsmyfqdn",
"ipv": "4"
}
}
그래서 나는 이것을 시도했다.
jq '.secure.stakeaddr = "내 좋은 주소"' config.json
그것은 나에게 다음과 같은 결과를 제공하지만 :
{
"stakeaddr": "my nice address",
"email": null,
"fqdn": null,
}
그러나 config.json을 실행하면 변경되지 않은 마지막 파일이 표시됩니다. 나는 또한 동일한 결과로 chmod 777을 사용해 보았습니다. 내가 뭘 잘못했는지 모르겠습니다.
답변1
jq
내부 편집이 없습니다.
대신에:
cp config.json config.json.tmp &&
jq '.secure.stakeaddr = "my nice address"' config.json.tmp >config.json &&
rm config.json.tmp
그러면 파일이 임시 파일에 복사되고 수정 사항이 적용되며(복사가 성공한 경우) 결과가 원래 파일 이름으로 리디렉션됩니다. 그런 다음 임시 파일이 삭제됩니다(호출이 jq
성공한 경우).
config.json
그러면 다음과 같은 새 파일이 제공됩니다.
{
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nice address",
"email": null,
"fqdn": null,
"ipv": "4"
}
}
쉘 변수에서 값을 삽입하려면 다음을 수행하십시오.
$ fqdn='Then she said "hello"'
$ jq --arg fqdn "$fqdn" '.secure.fqdn = $fqdn' file.json
{
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": null,
"email": null,
"fqdn": "Then she said \"hello\"",
"ipv": "4"
}
}
즉, will into를 사용한 다음 표현식 내에서 전달합니다 --arg variable value
. 그렇게 하면value
jq
$variable
jq
올바르게 인코딩된 값. 셸 변수 값을 표현식에 직접 삽입하면 해당 값이 인코딩되지 않으며 오류 또는 잘못된 JSON 문서가 발생할 수 있습니다.
답변2
jq에만 국한되지 않는 경우 쉬운 옵션이 있습니다.jtc
내부 수정을 허용합니다.
소스 json이 file 에 있다고 가정하면 config.json
추가 내용은 "stakeaddr": "my nice address"
다음과 같습니다.
bash $ jtc -w'[secure]' -mu'{ "stakeaddr": "my nice address" }' -f config.json
bash $ cat config.json
{
"active": "secure",
"secure": {
"email": null,
"fqdn": null,
"ipv": "4",
"nodeid": null,
"nodetype": "secure",
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nice address"
}
}
bash $
동일한 목표를 달성하는 방법에는 여러 가지가 있습니다. 태그가 stakeaddr
소스 json에 이미 존재한다는 점을 고려하면 더 나은 접근 방식은 다음과 같습니다.
bash $ jtc -w'[secure][stakeaddr]' -u'"my nice address"' -f config.json
답변3
대부분의 *nix 배포판에 이미 python
사전 설치되어 있고 데이터가 포함된 json 파일이 호출된다는 점을 고려하여 file.json
다음 스크립트를 실행하세요.
import json
from pprint import pprint
with open('file.json', 'r') as f:
jsonData = json.load(f)
pprint(jsonData)
다음과 유사한 결과가 인쇄됩니다.
{'active': 'secure',
'secure': {'email': None,
'fqdn': None,
'ipv': '4',
'nodeid': None,
'nodetype': 'secure',
'servers': ['ts2.na', 'ts1.na', 'ts3.na'],
'stakeaddr': None}}