jq json 파일이 첨부되지 않았습니다.

jq json 파일이 첨부되지 않았습니다.

다음과 같은 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. 그렇게 하면valuejq$variablejq올바르게 인코딩된 값. 셸 변수 값을 표현식에 직접 삽입하면 해당 값이 인코딩되지 않으며 오류 또는 잘못된 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}}

관련 정보