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

时间:2019-03-29 14:32:01

标签: sed yaml

我要替换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

2 个答案:

答案 0 :(得分:0)

您应该使用真实的解析器从YAML或在更新YAML文件时获取值。 sed并不是执行此类复杂操作的适当工具,尤其是当有人迁移时 在您的fields.typepaths行之间插入另一个键值对,或将一个项目附加到 路径值的顺序。

在文件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

如果paths下有多个项目,则它们都将被更新(假设路径中至少有一个/)。

答案 1 :(得分:0)

您无法通过sed命令直接实现此目的。 您需要进行YAML解析,并根据需要在解析后的数据上调用必要的sed命令。