我想基于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
答案 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解析器。