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

时间:2020-01-27 08:19:01

标签: bash yaml yq

我想基于value更改Yaml文件name

示例:

spec:
  containers:
    - name: app1
      image: imageurl.com
      command: []
      env:
      - name: MONGO_HOST
        value: localhost

在这里您可以看到我们为mongo主机添加了一个env。现在使用BASH我想根据MONGO_HOST

这样的条件更改value if - name: MONGO_HOST set value: 172.16.87.98

3 个答案:

答案 0 :(得分:4)

使用像yq这样的YAML语法感知解析器,该解析器使用jq作为其JSON处理器。 yq接受YAML输入,将其转换为JSON,并将其提供给jq

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

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

安装和使用非常简单,可以在yq: Command-line YAML/XML processor中找到,并且官方GitHub页面位于kislyuk/yq

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

答案 1 :(得分:4)

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

if语句来自外壳程序,该外壳程序检查grep是否确实找到了模式/ regexp并在这种情况下执行sed

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

-q表示使输出静音或静音。

--表示选项的结尾,因为选项-之后的所有选项通常都以破折号--开头,不再将其视为选项

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

编辑:Ranvijay Sachan指出,sed可以检查是否存在模式并替换下一行。

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

printf '%s\n' '/MONGO_HOST/+1s/^\([[:space:]]\+value:\).*/\1 172.16.87.98/' w | ed -s file.yaml

答案 2 :(得分:3)

您可以使用此awk

awk '/^[ \t]*- *name: *MONGO_HOST[ \t]*$/{p=NR}
p && NR==p+1{sub(/value:.+/, "value: 172.16.87.98")} 1' file.yml

spec:
  containers:
    - name: app1
      image: imageurl.com
      command: []
      env:
      - name: MONGO_HOST
        value: 172.16.87.98

但是,请记住,通常最好使用专用的yaml解析器。