jq in-place를 사용하여 json의 키 값 수정
특정 값을 수정하는 json이 있지만 터미널에는 항상 변경된 값을 가진 json이 표시되지만 실제로 특정 파일의 값은 변경되지 않습니다.샘플 json:
{
name: 'abcd',
age: 30,
address: 'abc'
}
파일 자체의 주소 값을 변경하고 싶은데, 아직 변경할 수 없습니다.다음을 사용해 보았습니다.
jq '.address = "abcde"' test.json
하지만 그것은 작동하지 않았다.좋은 의견이라도 있나?
임시 파일을 사용합니다.임플레이스 편집을 한다고 주장하는 모든 프로그램이 이 작업을 수행합니다.
tmp=$(mktemp)
jq '.address = "abcde"' test.json > "$tmp" && mv "$tmp" test.json
있지 는, 올바른 를 「어드레스」를 해 주세요.jq★★★★
address=abcde
jq --arg a "$address" '.address = $a' test.json > "$tmp" && mv "$tmp" test.json
AFAIKjq편집을 하지 않으므로 후 을 원래 하거나 임플레이스 파일을 해야 합니다.sponge더 많이 이용하다
jq '.address = "abcde"' test.json|sponge test.json
「같은 파일로 리다이렉트」하는 다른 테크닉도 있습니다.예를 들어, 출력을 변수인 t.c에 보존하는 등, 이것에 대해 자세하게 알고 싶다면, 「Unix & Linux Stack Exchange」를 추천합니다.
임시 파일은 불필요할 때 복잡해집니다(JSON 파일이 너무 커서 메모리에 넣을 수 없는 경우가 아니면(RAM/병렬 용량에 따라 GB에서 100 GB까지)).
순수한 배쉬 방식.
contents="$(jq '.address = "abcde"' test.json)" && \
echo -E "${contents}" > test.json
장점
- 저글링할 임시 파일이 없습니다.
- 순수한 배시
- 「」를 인스톨 하기
sponge되어 - 심플한
단점
- 문자 그대로 null 문자를 포함할 수 없기 때문에 json에 대해 완벽하게 작동합니다.이것을 json area 밖에서 시도하면 null이 발생했을 때 실패합니다(또한 부호화/복호화 회피책도 필요합니다).Bash 변수는 리터럴 null을 저장할 수 없습니다.
주의: 리다이렉션은 표현의 좌측(LHS)이 실행되기 전에 시작되어 실행 전에 리다이렉션을 시작할 수 있기 때문에 (@codekandis 권장과 같이) "1개의 명령어"로 조합할 수 없습니다.jq파일을 잘못 비우므로 두 개의 개별 명령어가 있습니다.시도할 때 효과가 있는 것처럼 보일 수 있지만, 이는 오해를 불러일으키고 상황이 바뀌자마자 실패할 가능성이 매우 높습니다.
업데이트: 추가됨-E에 있는 경우에 대비하여 이스케이프 문자를 비활성화하기 위한 옵션systems where they are interpreted by default.(실제로 본 적이 없는 것)
셰프너에 답변을 추가하고 셸 스크립트로 원하는 경우.
test.json
{
"name": "abcd",
"age": 30,
"address": "abc"
}
script.sh
#!/bin/bash
address="abcde"
age=40
# Strings:
jq --arg a "${address}" '.address = $a' test.json > "tmp" && mv "tmp" test.json
# Integers:
jq --argjson a "${age}" '.age = $a' test.json > "tmp" && mv "tmp" test.json
단일 및 다중 값이 변경되는 내포된 json 예제입니다.
config.json
{
"Parameters": {
"Environment": "Prod",
"InstanceType": "t2.micro",
"AMIID": "ami-02d8e11",
"ConfigRegion": "eu-west-1"
}
}
다음 명령을 사용하여 여러 값을 편집할 수 있습니다.
tmp=$(mktemp)
jq '.Parameters.AMIID = "ami-02d8sdfsdf" | .Parameters.Environment = "QA"' config.json > "$tmp" && mv "$tmp" config.json
다음 명령어를 사용하면 단일 값을 편집할 수 있습니다.
tmp=$(mktemp)
jq '.Parameters.AMIID = "ami-02d8sdfsdf"' config.json > "$tmp" && mv "$tmp" config.json
이것은 효과가 있을 것이다.
address = aaaaa
echo $(jq --arg a "$address" '.address = ($a)' test.json) > test.json
어떤 이유로든 에코가 없으면 bin 파일이 생성되고 python 스크립트는 해석할 수 없습니다.
나는 여기와 여기 두 가지 대답 중 가장 좋은 것을 얻었다.
여기에는 다음과 같은 파라미터가 사용됩니다.actionname할당에 대한 입력으로서name속성을 선택합니다.ACTION_NAME은 치환값으로 사용하는 envvar일 뿐입니다.
contents="$(jq --arg actionname ${ACTION_NAME} '.name = $actionname' ./${ACTION_NAME}/package.json)" && \
echo -E "${contents}" > ${ACTION_NAME}/package.json;
어떤 솔루션도 마음에 들지 않아 유틸리티를 만들었습니다.
pip install sde
그런 다음, 예를 들어 다음과 같은 JSON 데이터의 경우:
{
"Parameters": {
"Environment": "Prod",
"InstanceType": "t2.micro",
"AMIID": "ami-02d8e11",
"ConfigRegion": "eu-west-1"
}
}
다음과 같이 할 수 있습니다.
sde Parameters.Environment Dev test.json
언급URL : https://stackoverflow.com/questions/42716734/modify-a-key-value-in-a-json-using-jq-in-place
'programing' 카테고리의 다른 글
| 일관성이 없는 ERR_HTTP2_SERVER_REFUSED_페이지 로드 시 STREAM 오류 (0) | 2023.03.25 |
|---|---|
| 포트 80에서 Spring Boot 응용 프로그램을 실행하려면 어떻게 해야 합니까? (0) | 2023.03.25 |
| Angular를 사용한 서버 폴링JS (0) | 2023.03.25 |
| 각도 사용법특정 HTTP 요청만 가로채는 JS 인터셉터? (0) | 2023.03.25 |
| Spring-Boot에서 서버에서 다른 rest api 호출 (0) | 2023.03.25 |