환경 변수에서 두 개의 JSON을 연결하는 방법은 무엇입니까?

환경 변수에서 두 개의 JSON을 연결하는 방법은 무엇입니까?

JSON 텍스트가 포함된 환경 변수가 있습니다. jq도구를 사용하여 데이터를 추가하고 싶습니다 . 기존 필드를 모두 유지하면서 새 필드를 추가 및/또는 덮어쓰고 싶습니다. 아이디어는 변수에 경로를 추가하는 것과 동일 PATH하지만 JSON.

이해가 안 되더라도 만드는 방법과 예를 들어보세요. 내가 쓴 값에 대해

echo "{\"A\":\"Hello world\"}" | jq -r

이제 이 개체를 다른 개체와 병합하고 싶다고 가정해 보겠습니다.

echo "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}"

답변1

새 값이 이전 값을 완전히 대체하기 때문에 귀하의 예가 이상합니다. 원래 값에는 하나의 키 "A"만 있고 "병합"될 값에는 원래 값을 대체할 키 "A"에 대한 다른 값이 포함되어 있습니다.

따라서 설명을 위해 이러한 입력이 다른 순서로 되어 있다고 가정하겠습니다(그래서 "Hello world"가 "Goodbye world"보다 우선하고 "This is a joke"는 동일하게 유지됩니다).

다음을 수행할 수 있습니다.

( echo "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}" ; echo "{\"A\":\"Hello world\"}" ) | jq -s add

핵심은 두 개의 json 개체를 순서대로 공급하므로 마치 배열에 있는 것처럼 -s처리 할 수 있다는 것입니다. 그런 다음 배열의 모든 요소를 ​​함께 추가하는 필터에 전달하기만 하면 됩니다.jqadd

객체가 에 추가되면 jq병합되고 추가 작업의 오른쪽에 있는 객체(이 경우 두 객체 중 후자)를 위해 동일한 키가 확인됩니다.

문서를 참조하세요:

답변2

셸 트릭과 프로세스 대체를 사용하여 JSON 문자열을 입력 파일로 제공한 jq다음 두 파일의 내용을 연결할 수 있습니다.

jq -s '.[0] + .[1]' \
    <(echo "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}") \
        <(echo "{\"A\":\"Hello world\"}")

두 개체 간의 공통 키 이므로 A최종 결과에서는 대체됩니다.

{
  "A": "Hello world",
  "B": "This was a joke"
}

또는 입력 기능을 사용할 수 있습니다.

printf '%s\n%s\n' "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}" \
                  "{\"A\":\"Hello world\"}" | \
    jq '.+= input'

input기능사용:

inputinput[...]은 jq 자체와 동일한 소스(예: 명령줄에 이름이 지정된 파일인 stdin)에서 읽습니다. 이 두 가지 내장 함수는 jq의 자체 읽기 작업과 함께 서로 인터리브될 수 있습니다.

관련 정보