根据字符串删除线路



我有像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"

我不喜欢使用正则表达式来破解您可以解析的东西 - 这是我使用perlYAML模块来解决它的方法:

#!/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;

最新更新