首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用具有多个同名密钥的sed替换yml文件的内容

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

Stack Overflow用户
提问于 2019-03-29 22:32:01
回答 2查看 426关注 0票数 1

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

代码语言:javascript
复制
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,对于示例文件,我使用了以下行:

代码语言:javascript
复制
sed -i -e '/^ *ssl:/,/^ *[^:]*:/s/enabled: true/enabled: false/' test2.yaml 

更改内容后,它应该如下所示:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-03-31 00:01:34

您应该使用真正的解析器从YAML获取值,或者更新YAML文件。对于这种复杂的操作,sed不是合适的工具,特别是当有人在fields.typepaths行之间插入另一个键值对,或者在序列中附加一个路径的值的时候。

假设您在安装了ruamel.yaml (pip install ruamel.yaml)和脚本的input.yaml文件中输入:

代码语言:javascript
复制
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)

您可以执行以下操作:

代码语言:javascript
复制
< input.yaml python update.py > output.yaml

要获得以下信息:

代码语言:javascript
复制
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下有多个项目,它们都会更新(假设路径中至少有一个/ )。

票数 0
EN

Stack Overflow用户

发布于 2019-04-09 13:47:25

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55419669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档