programing

jq 필터에 인수 전달

iphone6s 2023. 3. 23. 22:22
반응형

jq 필터에 인수 전달

config.json은 다음과 같습니다.

{
    "env": "dev",
    "dev": {
        "projects" : {
            "prj1": {
                "dependencies": {},
                "description": ""
            }
        }
    }
}

bash 명령어는 다음과 같습니다.

PRJNAME='prj1'

echo $PRJNAME

jq --arg v "$PRJNAME" '.dev.projects."$v"' config.json 
jq '.dev.projects.prj1' config.json 

출력:

prj1
null
{
  "dependencies": {},
  "description": ""
}

따라서 $PRJNAME은 prj1이지만 첫 번째 호출은 출력만 합니다.null.

누가 나 좀 도와줄래?

jq 프로그램.dev.projects."$v"이 예에서는, 문자 그대로, 라고 하는 이름의 키를 찾으려고 합니다."$v"대신 다음을 시도해 보십시오.

jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json 

사용할 수 있습니다.--argjson네 아들을 만들 때도 마찬가지야

--arg a v       # set variable $a to value <v>;
--argjson a v   # set variable $a to JSON value <v>;

위의 댓글에서 물어본 바와 같이 여러 개의 아르구메트를 패스하는 방법이 있습니다.좀 더 우아한 방법이 있을지도 모르지만, 효과가 있어요.

  • 반드시 모든 키가 필요한 경우 다음을 사용할 수 있습니다.
jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '

  • 키를 항상 사용하지 않는 경우 다음과 같이 할 수 있습니다.
jq --arg key $k ' if key != "" then .[$key] else . end'

  • 키가 어레이를 참조하는 경우가 있는 경우:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'

물론 당신은 이것들을 결합할 수 있습니다!

다음과 같이 할 수 있습니다.


    key="dev.projects.prj1"
    filter=".$key"
    cat config.json | jq $filter

json 파일의 어레이를 대체하기 위한 bash 명령어 예를 나타냅니다.모든 것이 변수입니다.

a=/opt/terminal/conf/config.json ; \
b='["alchohol"]' ; \
c=terminal.canceledInspections.resultSendReasons ; \
cat $a | jq .$c ; \
cat $a | jq --argjson b $b --arg c $c 'getpath($c / ".") = $b' | sponge $a ; \
cat $a | jq .$c

언급URL : https://stackoverflow.com/questions/34745451/passing-arguments-to-jq-filter

반응형