我想改变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 '...'
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)
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)