2014-10-02 3 views
1

Я использую ShellScript для редактирования файла конфигурации привязки dns при добавлении и удалении ссылок на зоны. Затем в файле «master.conf» мы имеем это содержание:Использование sed для замены всей фразы

... 
... 
zone "mydomain.com" { 
    type master; 
    file "/var/zones/m/mydomain.com" 
}; 
... 
... 

Я хочу «удалить» эту запись в «mydomain.com» с использованием «SED», но я could'n написать правильное регулярное выражение для этого , Выражение должно использовать переменное доменное имя и не поиск до следующей закрывающей скобки и точки с запятой, что-то вроде этого:

DOMAIN_NAME="mydomain.com" 
sed -i.bak -r 's/^zone "'$DOMAIN_NAME'" \{(.*)\};$//g' /var/zones/master.conf 

Смотрите, что мы должны игнорировать содержание, заключенные в скобках, и этот куску придется заменить на «ничего». Я пробовал некоторые варианты этого выражения, но безуспешно.

+0

довольно опасное регулярное выражение, так как '(. *)' Собирается всасывать все до ** LAST ** '}' в файл. вы можете потенциально уничтожить все зоны в файле. –

+0

@Mark только для следующего закрытого кронштейна. Я уже изменяю текст из вопроса. Спасибо за внимание. – rcsalvador

ответ

2

Может быть, вы могли бы использовать AWK?

awk -v dom="mydomain.com" '$2 ~ dom, /^};$/ {next}1' file 

, является оператором дальности действия. Диапазон равен true между строками с dom во втором поле и строкой, содержащей только "};". next пропускает эти линии. Остальные печатаются.

Используйте awk '...' file > tmp && mv tmp file для перезаписи исходного файла.

+0

Да, я могу использовать awk. Но когда я пробовал ваш намек, результатом был запись записи. В моем вопросе я хочу ** удалить ** этот фрагмент текста из файла, заменив его на '' (пустая строка). – rcsalvador

+0

Весь смысл сценария в том, что он пропускает запись (это то, что делает «следующий»). Он работает для меня, используя ваш образец ввода. –

+0

Том, ваше решение отлично работает и было более элегантно в моем сценарии. Я поспешил с моим предыдущим комментарием. Большое спасибо. – rcsalvador

0

Если это не обязательно один лайнер, вы можете использовать «grep» для получения номеров строк, а затем использовать «sed», чтобы удалить всю строфу из номеров строк.

См Delete specific line number(s) from a text file using sed?

1

Попробуйте ниже SED сценарий, он должен работать

Код:

sed -i '/"mydomain.com" [{]/{ 
:loop 
N 
s/[}][;]/&/ 
t end 
b loop 
:end 
d 
}' master.conf 

Вход:

zone "myd.com" { 
    type master; 
    file "/var/zones/m/mydomain.com" 

}; 
zone "mydomain.com" { 
    type master; 
    file "/var/zones/m/mydomain.com" 
}; 

Выход:

zone "myd.com" { 
     type master; 
     file "/var/zones/m/mydomain.com" 

    }; 
+0

Ухх, хорошо. Это прекрасно работает! – rcsalvador

+0

Только одно, есть разрыв строки после закрытия скобки. Какой символ я должен помещать в регулярное выражение, чтобы удалить этот разрыв строки? Я пробовал \ n и [\ n], но не удалялся за строкой. – rcsalvador

Смежные вопросы