Dev*_*rae 0 linux bash json sed
我正在尝试使用 linux 命令sed动态替换“branch”属性的值。但是,这里有一个关键点......我使用 bash 环境变量作为值。
环境变量:
export BRANCH_NAME=release/feature-branch
Run Code Online (Sandbox Code Playgroud)
这是我的 json:
{
"settings": {
"repo": "myrepo/my-service",
"branch": "feature/addition-1"
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用 sed 将 JSON 转换为:
{
"settings": {
"repo": "myrepo/my-service",
"branch": "release/feature-branch"
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过stackoverflow 上的其他示例,但没有成功:
sed -i '/branch/c\ \"branch\" : "${BRANCH_NAME}"' settings.json
Run Code Online (Sandbox Code Playgroud)
结果是:
{
"settings": {
"repo": "myrepo/my-service",
"branch": "${BRANCH_NAME}"
}
}
Run Code Online (Sandbox Code Playgroud)
最好的选择是使用知道如何读写 JSON 语法的东西。规范的工具是jq. 假设我们已经设置了 shell 变量$BRANCH_NAME,我们会执行如下操作:
$ jq --arg branch_name "$BRANCH_NAME" \
'.settings.branch = $branch_name' settings.json
{
"settings": {
"repo": "myrepo/my-service",
"branch": "release/feature-branch"
}
}
Run Code Online (Sandbox Code Playgroud)
这个命令的问题sed:
sed -i '/branch/c\ \"branch\" : "${BRANCH_NAME}"' settings.json
Run Code Online (Sandbox Code Playgroud)
是单引号 ( ') 抑制变量扩展。你可以这样做:
sed -i '/branch/c\ \"branch\" : "'"${BRANCH_NAME}"'"' settings.json
Run Code Online (Sandbox Code Playgroud)
请注意那里有些复杂的引用;我们有效地:
'...something in single quotes'...something outside single quotes...'something inside single quotes...'
Run Code Online (Sandbox Code Playgroud)
进一步来说:
'/branch/c\ \"branch\" : "'"${BRANCH_NAME}"'"'这样,表达式"${BRANCH_NAME}"就位于单引号之外并由 shell 扩展。
演示:
$ sed '/branch/c\ \"branch\" : "'"${BRANCH_NAME}"'"' settings.json
{
"settings": {
"repo": "myrepo/my-service",
"branch": "release/feature-branch"
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |