如何使用Sed匹配YAML文件行首指定模式后删除对应内容块?
Sed删除YAML指定配置块实现方案
可用命令
直接执行以下命令即可处理目标YAML文件,默认输出处理后的结果到终端:
sed '/^LaunchPad:/{:del; N; /\n[^-]/!b del; s/LaunchPad:.*\n//}' your_file.yaml
如果需要直接修改原文件,添加-i参数即可:
sed -i '/^LaunchPad:/{:del; N; /\n[^-]/!b del; s/LaunchPad:.*\n//}' your_file.yaml
如果待删除的LaunchPad块可能出现在YAML文件末尾(后面没有其他顶层配置项),可以使用兼容末尾场景的版本:
sed '/^LaunchPad:/{:del; $d; N; /\n[^-]/!b del; s/LaunchPad:.*\n//}' your_file.yaml
命令逻辑说明
- 第一步通过正则
/^LaunchPad:/精准定位要删除的配置块起始行,即行首为LaunchPad:的顶层配置项,不会误判缩进位置出现的同名内容 - 定位到起始行后设置循环标签
del,逐行追加读取后续内容到模式空间 - 每读入一行就判断当前最新读入的行是否以
-开头:如果是就继续循环读下一行;如果碰到行首不是-的内容(也就是下一个顶层配置项的开头),立刻终止循环 - 最后把模式空间中从
LaunchPad:开始到最后一个换行之间的所有待删除内容清空,保留终止位置的非-开头行及后续所有内容,不会越界删除其他配置块
适配说明
如果需要删除其他顶层配置块,只需要把命令里两处LaunchPad:替换成对应目标块的行首关键词即可,比如要删除Keypages块就把匹配正则改成/^Keypages:/,替换规则里的关键词同步替换即可。
处理示例给出的原始YAML内容,执行命令后得到的结果完全匹配预期:
Keypages: - name: Key pages Microservices: - name: 'Micro services '
内容的提问来源于stack exchange,提问作者CFM
相关产品推荐
相关产品推荐

