我有一个yaml文件,如下所示:
airflow:
images:
test1:
fact1: value1
fact2: value2
fact3: value3
dags:
test2:
fact4: value4
fact5: value5
我想通过在gitlab CI期间运行命令来更新fact3(value3)的值请注意,这是必需的yaml文件的一部分,而且我并不总是知道fact3的确切值。我想使用sed和awk命令更新这个值。我试过了:
# Set the path to the YAML file
yaml_file="test.yaml"
# Get the current value
current_value=$(awk '/^airflow:/,/^ *$/' $yaml_file | grep fact3 | awk '{print $2}')
# Update the value in the YAML file
sed -i "s/(^s*fact3s*:s*)$current_value/1$new_value/" $yaml_file
注意这里的new_value是一个gitlab变量。问题是,当我执行此命令时,它不会替换值。相反,它将新值与旧值附加在一起。例如,如果我的new值是"new"更新后,它显示fact3为
fact3: newvalue3
但是当我在本地执行它时,它像预期的那样工作。我想不出这个问题。
Ruby通常可用,并且有一个YAML解析器。
给出你的例子:
---
airflow:
images:
test1:
fact1: value1
fact2: value2
fact3: value3
dags:
test2:
fact4: value4
fact5: value5
下面是一个简单的Ruby修改YAML路径值:
ruby -r yaml -e 'd=YAML.load($<.read)
d["airflow"]["images"]["test1"]["fact3"]="newvalue3"
puts d.to_yaml
' file.yaml
打印:
---
airflow:
images:
test1:
fact1: value1
fact2: value2
fact3: newvalue3
dags:
test2:
fact4: value4
fact5: value5