例如我在文件“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
(或 shell 变量中作为字符串给出的任何内容key
)。它将第一个#
字符之前的值部分替换为command
(或 shell 变量中给出的任何内容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)
如果你想保留shell进程,可以替换exec
为。eval