代码之家  ›  专栏  ›  技术社区  ›  Rahul Tibrewal

使用具有相同名称的多个密钥的SED替换YML文件的内容

  •  0
  • Rahul Tibrewal  · 技术社区  · 6 年前

    我想替换YML文件中每个日志的路径,下面是我的文件

    filebeat.inputs:
    
    - type: log
      enabled: true
      fields.type: spark
      paths:
        - /var/log/*.log
    
    - type: log
      enabled: true
      fields.type: kafka
      paths:
        - /var/log/*.log
    

    我不知道如何替换具有多个相同类型的值,即-type:log 通常,对于示例文件,我使用以下行:

    sed -i -e '/^ *ssl:/,/^ *[^:]*:/s/enabled: true/enabled: false/' test2.yaml 
    

    在更改内容之后,应该是:

    filebeat.inputs:
    
    - type: log
      enabled: true
      fields.type: spark
      paths:
        - /var/log/spark/*.log
    
    - type: log
      enabled: true
      fields.type: kafka
      paths:
        - /var/log/kafka/*.log
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Anthon    6 年前

    您应该使用真正的解析器从yaml获取值,或者在更新yaml文件时使用。 sed 对于如此复杂的操作来说,不是合适的工具,尤其是如果有人能够 在 fields.type paths 行,或将项附加到 路径值的序列。

    在文件中输入 input.yaml ,安装Ruamel.yaml ( pip install ruamel.yaml

    import sys
    import ruamel.yaml
    
    yaml = ruamel.yaml.YAML()
    data = yaml.load(sys.stdin)
    for item in data['filebeat.inputs']:
        try:
            ft = item['fields.type']
            paths = item['paths']
            for idx, path in enumerate(paths):
                pre, post = path.rsplit('/', 1)
                paths[idx] = pre + '/' + ft + '/' + post
        except Exception as e:
            print(e)
            pass
    yaml.dump(data, sys.stdout)
    

    你可以这样做:

    < input.yaml python update.py > output.yaml
    

    得到:

    filebeat.inputs:
    
    - type: log
      enabled: true
      fields.type: spark
      paths:
      - /var/log/spark/*.log
    
    - type: log
      enabled: true
      fields.type: kafka
      paths:
      - /var/log/kafka/*.log
    

    如果下面有多个项目 路径 ,它们都会更新(假设至少有一个 / 在路上)。

        2
  •  0
  •   Nobita    6 年前

    您不能通过sed命令直接实现这一点。 您需要进行YAML解析,并根据您的需求,对解析的数据调用必要的SED命令。

    推荐文章