5

我想根据以下内容更改 yamlvalue文件name

例子:

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

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

4

3 回答 3

11

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

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

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

安装和使用非常简单,可以在yq 中找到:命令行 YAML/XML 处理器

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


迈克法拉/yq

mikefarah/yq是 YAML 解析器的 Go 实现,从 v4 开始,它采用了类似于jq. 所以使用相同的,一个可以做

yq e '(.spec.containers[].env[]|select(.name == "MONGO_HOST").value) |= "172.16.87.98"' yaml
于 2020-01-27T08:38:44.607 回答
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

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

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

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

表示选项的--结尾,因为选项通常以破折号开头, grep-之后的任何内容--都不再将其视为选项

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

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

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

printf '%s\n' '/MONGO_HOST/+1s/^\([[:space:]]\+value:\).*/\1 172.16.87.98/' ,p w | ed -s file.yaml
于 2020-01-27T13:15:04.870 回答
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 解析器。

于 2020-01-27T08:27:17.173 回答