使用bash脚本替换yaml文件值

时间:2018-08-22 17:26:46

标签: bash shell yaml

我有一个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处理库,只能使用sedawk等。

我尝试了循环方法,其中我虽然循环浏览yaml文件,但是它变得过于混乱和混乱,因为我首先注意到了参数的行号,尝试从该行号开始进行循环,然后比较名称值,然后查找该名称下的值并将其替换。这似乎不是我的正确方法。有人可以建议一种更简单的方法吗?

2 个答案:

答案 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方法将按预期停止工作。