我有一个变量myStr
,其中包含以下值:
"app": {
"services": {
"app": [{
"groupID": "com.mycompany",
"artifactId": "myapp-versions",
"version": "1.0.0"
},
{
"groupID": "com.mycompany.xyz",
"artifactId": "car-stats",
"version": "1.0-master"
},
{
"groupID": "com.mycompany.service",
"artifactId": "my-differential-service",
"version": "1.0.0-master"
}
]
}
}
现在我只想将my-differential-service
artifactId的版本替换为NEW_VERSION
。
我尝试在myStr
变量上使用sed命令,但由于我对该命令不太熟悉,因此无法成功。
有人可以指导我如何继续实现这一目标吗? 任何帮助将不胜感激。
答案 0 :(得分:0)
当您需要sed
进行解析时,请在-z
中寻求对选项sed
的支持。此选项忽略\n
的特殊含义。
如果您知道版本是artifactId之后的第一个字段,则可以尝试
new_version=1.0.1 # avoid uppercase variable names
echo "$myStr" |
sed -rz 's/("my-differential-service",[^:]*: ")[^"]*/\1'"${new_version}"'/'
当字段顺序可以更改时,您可能需要在Jenkins中询问jq
或尝试使用awk
。
如果您想使用sed
但没有-z
选项,则可以先翻译:
echo "$myStr" | tr '\n' '\r' | sed -r 's/..../' | tr '\r' '\n'
答案 1 :(得分:0)
如果jq
可用,那么恭喜!并请尝试以下操作:
echo "{ $myStr }" | jq '(.app.services.app[] | select(.artifactId == "my-differential-service") | .version) = "NEW_VERSION"'
产生:
{
"app": {
"services": {
"app": [
{
"groupID": "com.mycompany",
"artifactId": "myapp-versions",
"version": "1.0.0"
},
{
"groupID": "com.mycompany.xyz",
"artifactId": "car-stats",
"version": "1.0-master"
},
{
"groupID": "com.mycompany.service",
"artifactId": "my-differential-service",
"version": "NEW_VERSION"
}
]
}
}
}
如果不需要最外面的花括号,请通过bash的参数扩展或类似方法将其删除。
作为后备选项,您可以使用sed
来表示:
echo "$myStr" | sed '
:l
N
$!b l
s/\("my-differential-service"[^"]*"version": *\)"[^"]*"/\1"NEW_VERSION"/g'
希望这会有所帮助。