Sureshchandra Jarugula
Sureshchandra Jarugula

Reputation: 123

To remove line based on string

I have file like test.yaml file, the text content in the file like below.

servers:
  - uri: "http://demo.nginx1.com/status"
    name: "NGinX Monitor1"
  - uri: "http://demo.nginx2.com/status"
    name: "NGinX Monitor2"

I want to remove - uri line and immediate next line (start with name:) where host name = demo.nginx1.com. I want out put like below.

servers:
  - uri: "http://demo.nginx2.com/status"
    name: "NGinX Monitor2"

I tied like below.. cat test.yaml | grep -v demo.nginx1.com | grep -v Monitor1 >> test_back.yaml mv test_back.yaml test.yaml

I am getting expected out put. But it's re creating the file and I don't want to re create the file

Please help me with suitable command that i can use..

Upvotes: 0

Views: 1251

Answers (2)

Inian
Inian

Reputation: 85693

Just a simple logic using GNU sed

sed '/demo.nginx1.com/,+1 d' test.yaml
servers:
  - uri: "http://demo.nginx2.com/status"
    name: "NGinX Monitor2"

For in-place replacement, add a -i flag as -i.bak

sed -i.bak '/demo.nginx1.com/,+1 d' test.yaml

To see the in-place replacement:-

cat test.yaml
servers:
  - uri: "http://demo.nginx2.com/status"
    name: "NGinX Monitor2"

Upvotes: 2

Sobrique
Sobrique

Reputation: 53488

As I dislike using regular expressions to hack something you can parse - here's how I'd tackle it, using perl and the YAML module:

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

Upvotes: 0

Related Questions