如何使用 sed 将 JSON 值替换为变量,但不使用正斜杠分隔符?

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)

lar*_*sks 5

最好的选择是使用知道如何读写 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)