我有一个Yaml文件,想替换其中的特定值。请注意,此值可以在不同参数下具有多个条目,但是我只想替换该特定事件。这是我的示例代码:
parameters:
- name: COUNT_1
displayName: First Counter
required: true
value: "1"
- name: COUNT_2
displayName: Second Counter
required: false
value: "1"
在这里,我只想用value: "1"
之类的内容替换 COUNT_2 下的value: "2"
,而不是COUNT_1。我不能使用任何类型的外部yml处理库,只能使用sed
或awk
等。
我尝试了循环方法,其中我虽然循环浏览yaml文件,但是它变得过于混乱和混乱,因为我首先注意到了参数的行号,尝试从该行号开始进行循环,然后比较名称值,然后查找该名称下的值并将其替换。这似乎不是我的正确方法。有人可以建议一种更简单的方法吗?
答案 0 :(得分:1)
您可以使用此awk
:
awk '$2 == "name:" { tag = ($3 == "COUNT_2") }
tag && $1 == "value:"{$1 = " " $1; $2 = "2"} 1' file.yaml
parameters:
- name: COUNT_1
displayName: First Counter
required: true
value: "1"
- name: COUNT_2
displayName: Second Counter
required: false
value: 2
答案 1 :(得分:1)
太糟糕了,您在限制自己。这是用红宝石做的方法
ruby -e '
require "yaml"
data = YAML.load File.read ARGV.shift
data["parameters"].select {|h| h["name"] == "COUNT_2"}.each {|h| h["value"] = "2"}
puts YAML.dump(data)
' file.yml
使用正确的YAML解析器很重要。例如,如果您的YAML看起来像
parameters:
- value: "1"
name: COUNT_1
displayName: First Counter
required: true
- value: "1"
name: COUNT_2
displayName: Second Counter
required: false
即值出现在名称前,awk方法将按预期停止工作。