2016-12-13 3 views
0

У меня есть файл, такой как файл test.yaml, текстовый контент в файле, как показано ниже.Чтобы удалить строку на основе строки

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

Я хочу удалить - URI линии и немедленным следующая строка (начать с именем :) где имя хоста = 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.yaml mv test_back.yaml test.yaml

Я получаю ожидаемый выход. Но это повторное создание файла, и я не хочу, чтобы заново создать файл

Пожалуйста, помогите мне с соответствующей командой, что я могу использовать ..

+0

Вы можете форматировать свой текст, как он находится в файле? Вы написали его как одну строку, но в своем объяснении вы указываете несколько строк (ближайшая следующая строка). – palako

+0

############## серверов: - uri: "http://demo.nginx1.com/status" имя: "NGinX Monitor1" - uri: «http://demo.nginx2.com/status» имя: «NGinX Monitor2» ########### –

+0

так что это одна линия? и вы хотите удалить части строки, а не строки, правильно? как он выглядел бы после того, как вы удалили части, которые вам не интересны? – palako

ответ

1

Просто простая логика использования 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" 
+0

Привет! Я получаю значение как переменная ,,, я надеюсь, что это не сработает, если дать команду, как показано ниже. NGHOST = demo.nginx1.com sed '/ $ NGHOST /, + 1 d' test.yaml .. –

+1

upvote , простейший ответ. Просто следите за использованием нестандартного +1 модификатора, он не будет работать на не-gnu sed, как на OS X. Вместо этого вы можете использовать gsed. – palako

+0

@SureshchandraJarugula: Если вы используете 'GNU sed', используйте двойные кавычки, такие как' sed '/ $ NGHOST /, + 1 d "test.yaml' – Inian

0

Как я не люблю использовать регулярные выражения, чтобы взломать что-то можно разобрать - вот как я бы решить ее, используя 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; 
Смежные вопросы