我有一个Yaml格式的文件(如下所述)。
values.yml
replicaCount: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds: 5
nodeSelector:
role: nginxplus
image:
repository: 2xxxxxxxxxxx6.dkr.ecr.us-east-1.amazonaws.com/miqp-devops
tag: foo
pullPolicy: IfNotPresent
现在我想用另一个值替换key标记。价值来自变量。
例如,
VAR=bar
echo $VAR
bar
我想要一些可以编辑我的values.yml文件并替换
的东西tag:foo to tag:bar
由于
答案 0 :(得分:1)
sed 方法:
var="bar"
sed -i "s/^\([[:space:]]*tag:[[:space:]]*\).*/\1$var/" values.yml
最终values.yml
内容:
replicaCount: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds: 5
nodeSelector:
role: nginxplus
image:
repository: 2xxxxxxxxxxx6.dkr.ecr.us-east-1.amazonaws.com/miqp-devops
tag: bar
pullPolicy: IfNotPresent
答案 1 :(得分:1)
要做到这一点(是的,它会更改您的数据的表示,但它仍然是100%有效的YAML):
# This uses/requires the PyYAML library; "pip install PyYAML"
yaml2json() {
python -c 'import yaml, json, sys; print json.dumps(yaml.safe_load(sys.stdin))'
}
editYaml() {
local file=$1; shift
local tempfile=$(mktemp "${file}.XXXXXX")
local retval
if jq "$@" < <(yaml2json <"$file") >"$tempfile"; then
chmod --reference="$file" -- "$tempfile" # on GNU systems, preserve permissions
mv -- "$tempfile" "$file"
else
retval=$?
rm -f -- "$tempfile"
return "$retval"
fi
}
newTag=bar
editYaml values.yml --arg newTag "$newTag" '.image.tag = $newTag'
这种方法确保将相同的数据转换为相同的输出,无论它如何表示 - 至关重要,因为YAML提供了许多文本不同的方式来编写相同的语义内容。
答案 2 :(得分:0)
我使用perl和YAML::Tiny模块
cp values.yml values.yml.orig
perl -MYAML::Tiny -se '
$file = shift @ARGV;
$yaml = YAML::Tiny->read($file);
$yaml->[0]{image}{tag} = $newtag;
$yaml->write($file);
' -- -newtag="bar" values.yml
cat values.yml
---
image:
pullPolicy: IfNotPresent
repository: 2xxxxxxxxxxx6.dkr.ecr.us-east-1.amazonaws.com/miqp-devops
tag: bar
minReadySeconds: '5'
nodeSelector:
role: nginxplus
replicaCount: '2'
strategy:
rollingUpdate:
maxSurge: '1'
maxUnavailable: '1'
type: RollingUpdate