在我的yaml文件中,我想在匹配模式后使用Sed删除一个块。
例:
Keypages:
- name: Key pages
LaunchPad:
- name: "U0001F680Launch Pad"
- location: US
Microservices:
- name: 'Micro services '
在这个例子中,当在一行的开头匹配LaunchPad(例如)时,我想删除它和它的块(对我来说,以-开头的行,然后在找不到-时停止)
结果:
Keypages:
- name: Key pages
Microservices:
- name: 'Micro services '
谢谢
使用这个 Perl 单行:
perl -i.bak -ne 'print unless m{^LaunchPad} .. !m{^s*-}' in_file
Perl 单行代码使用以下命令行标志:-e
:告诉 Perl 在内联而不是在文件中查找代码.-n
:一次循环一行输入,默认情况下将其分配给$_
.-i.bak
:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过将扩展名.bak
附加到其名称来保存原始文件的备份副本。
EXPR1 .. EXPR2
:在表达式 EXPR1 为真和表达式EXPR2
为真(包含)之间,这是正确的。
!m{^s*-}
:与行以 0 个或多个空格字符开头后跟短划线的模式不匹配。
另请参阅:perldoc perlrun
: 如何执行 Perl 解释器: 命令行开关perldoc perlre
: Perl 正则表达式 (regexes)perldoc perlre
: Perl 正则表达式 (regexes): 量词;角色职业和其他特殊逃生;断言;捕获组perldoc perlrequick
:Perl 正则表达式快速入门
使用 python PyYaml 库,您可以使用以下脚本作为过滤器,删除任何名为LaunchPad
的部分:
import sys, yaml
data = yaml.safe_load(sys.stdin)
del data['LaunchPad']
yaml.dump(data, sys.stdout)
只需运行:python above-script < input.yml > output.yml
给定此输入:
Keypages:
- name: Key pages
LaunchPad:
- name: "U0001F680Launch Pad"
- location: US
Microservices:
- name: 'Micro services '
上面的脚本生成以下输出:
Keypages:
- {name: Key pages}
Microservices:
- {name: 'Micro services '}
这可能对你有用(GNU sed):
sed -n '/^LaunchPad:/{:a;n;/^-/ba};p' file
关闭隐式打印-n
。
匹配以LaunchPad:
开头的行,然后获取以-
开头的后续行。
打印所有其他行。
另类:
sed '/LaunchPad:/{:a;N;/^-/Ms/n//;ta;D}' file