如果名称:xxx 用 bash 替换 yaml 中的值

Ran*_*han 5 bash yaml yq

我想改变YAML文件value依据name

例子:

spec:
  containers:
    - name: app1
      image: imageurl.com
      command: []
      env:
      - name: MONGO_HOST
        value: localhost
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到我们为 mongo 主机添加了一个环境。现在使用BASH我想MONGO_HOST value根据条件进行更改if - name: MONGO_HOST set value: 172.16.87.98

Ini*_*ian 10

kislyuk/yq是一个 YAML 语法感知解析器,jq用作其 JSON 处理器。yq接受 YAML 输入,将其转换为 JSON,并将其提供给jq

过滤器,下面的部分'..'应用于 JSON 对象,并形成更新 IP 的结果 JSON,并由于-y参数将其转换回 YAML 格式。

yq -y '(.spec.containers[].env[]|select(.name == "MONGO_HOST").value)|="172.16.87.98"' yaml  
Run Code Online (Sandbox Code Playgroud)

yq 中提供的安装和使用非常简单:命令行 YAML/XML 处理器

您可以使用就地编辑选项-i,就像sed -i避免重定向到临时文件一样yq -yi '...'


迈克法拉/yq

mikefarah/yq是 YAML 解析器的 Go 实现,自 v4 以来,它采用了类似于jq. 所以使用相同的,可以做到

yq -y '(.spec.containers[].env[]|select(.name == "MONGO_HOST").value)|="172.16.87.98"' yaml  
Run Code Online (Sandbox Code Playgroud)


Jet*_*sel 5

Sed 需要知道MONGO_HOST该文件中是否确实存在,因此 grep 进入解决方案。

 if grep -Fq -- "- name: MONGO_HOST" file.yaml; then
   sed 's/^\([[:space:]]\+value:\).*/\1 172.16.87.98/' file.yaml
 fi
Run Code Online (Sandbox Code Playgroud)

if 语句来自 shell,它检查 grep 是否真的找到了模式/正则表达式并sed在这种情况下执行。

所述-F的grep正在寻找固定的字符串的手段,而不是BRE(基本正则表达式),也不ERE(扩展正则表达式)

-q意味着安静或静音输出。

--手段结束的选项,因为这些选项通常以破折号开始-什么后--的grep不会把它当作一种选择了

如果该文件中有多个value:带有正则表达式的字符串。 yml sed 将全部替换。但正如建议的那样,已经使用正确的工具来解析/编辑 yaml 文件。

编辑:正如Ranvijay Sachansed所指出的,可以检查模式是否存在并替换以下行。

使用基于命令的文件编辑器 ed

printf '%s\n' '/MONGO_HOST/+1s/^\([[:space:]]\+value:\).*/\1 172.16.87.98/' ,p w | ed -s file.yaml
Run Code Online (Sandbox Code Playgroud)