删除匹配模式后包含字符串的行?



在我的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

相关内容

  • 没有找到相关文章

最新更新