我有像test.yaml文件一样的文件,如下面的文件中的文本内容。
servers:
- uri: "http://demo.nginx1.com/status"
name: "NGinX Monitor1"
- uri: "http://demo.nginx2.com/status"
name: "NGinX Monitor2"
我想删除-URI线和立即下一行(以名称启动:) host name = demo.nginx1.com。我想像下面的那样放置。
servers:
- uri: "http://demo.nginx2.com/status"
name: "NGinX Monitor2"
我像下面一样捆绑。猫test.yaml |grep -v demo.nginx1.com |grep -v Monitor1>> test_back.yamlMV test_back.yaml test.yaml
我被期待。但是它正在创建文件,我不想重新创建文件
请帮助我使用可以使用的合适命令。
只是使用GNU sed
sed '/demo.nginx1.com/,+1 d' test.yaml
servers:
- uri: "http://demo.nginx2.com/status"
name: "NGinX Monitor2"
对于in-place
替换,添加-i
标志为-i.bak
sed -i.bak '/demo.nginx1.com/,+1 d' test.yaml
查看就地替换: -
cat test.yaml
servers:
- uri: "http://demo.nginx2.com/status"
name: "NGinX Monitor2"
我不喜欢使用正则表达式来破解您可以解析的东西 - 这是我使用perl
和YAML
模块来解决它的方法:
#!/usr/bin/env perl
use strict;
use warnings;
use YAML;
use Data::Dumper;
#load yaml by reading files specified as args to stdin,
#or piped in. (Just like how you'd use 'sed')
my $config = Load ( do { local $/ ; <>} );
#output data structure for debug
print Dumper $config;
#use grep to filter the uri you don't want.
@{$config -> {servers}} = grep { not $_ -> {uri} =~ m/demo.nginx2/ } @{$config -> {servers}};
#resultant data structure
print Dumper $config;
#output YAML to STDOUT
print Dump $config;