예를 들어 "somefile.json" 파일의 텍스트는 다음과 같습니다.
{
"dependencies": {
"name1": "text1#version1",
"name2": "text2#version2",
"name3": "text3#version3"
},
"wont-need-to-get-versions-from-here": [
{
"randomtext": "randomtext",
"randomurl": "randomurl",
"scopes": [
"randomscope"
]
}
]
}
"version2"
나는 의 도움을 받아 "name2"
명령이 이면 명령의 확장으로 사용하고 싶습니다 . "command"
그것을 얻은 후에 "version2"
는 이어야 합니다 "command#version2"
. 어쩌면 이 명령과 추출을 "version2"
일부 .sh 파일에 기록해야 할까요? (멍청한 질문이었다면 죄송합니다)
답변1
문자열 name2
및 command
가 찾고 있는 명령에 대한 두 개의 입력이고 질문의 문서가 제공되면 command#version2
이 문자열을 사용하여 쿼리 결과를 얻고 싶다고 가정합니다.
이 jq
명령은 JSON 문서를 쿼리하거나 수정하는 데 사용됩니다. 다음 명령은 dependencies
키가 문자열 name2
(또는 쉘 변수에 문자열로 지정된 모든 항목 key
)에 해당하는 하위 개체에서 값을 추출합니다. 첫 번째 문자 #
앞의 값 부분을 command
(또는 쉘 변수에 지정된 모든 것 cmd
)로 대체합니다. 필요한 경우 결과 문자열이 디코딩되어 표준 출력 스트림으로 인쇄됩니다.
key='name2'
cmd='some command'
jq -r --arg key "$key" --arg cmd "$cmd" \
'.dependencies[$key] // empty | sub("^[^#]*"; $cmd)' somefile.json
문제의 문서가 주어지면 위의 내용이 생성됩니다.
some command#version2
dependencies
하위 개체의 키가 지정된 값과 일치하지 않으면 이 $key
명령은 출력을 생성하지 않습니다.
답변2
가치를 얻으세요 text2#version2
:
jq -r '.dependencies.name2' somefile.json
text2#version2
두 번째 필드를 잘라냅니다 version2
.
jq -r '.dependencies.name2' somefile.json | cut -d# -f2
version2
주문 실행 command#version2
:
exec command#$(jq -r '.dependencies.name2' somefile.json | cut -d# -f2)
쉘 프로세스를 유지하려면 exec
.eval