在添加和删除区域引用时,我使用ShellScript编辑我的bind dns配置文件。 然后在" master.conf"文件我们有这个内容:
...
...
zone "mydomain.com" {
type master;
file "/var/zones/m/mydomain.com"
};
...
...
我想"删除"这个条目是" mydomain.com"使用" sed",但我可以为此写一个正确的正则表达式。表达式必须使用变量域名并搜索直到下一个括号和分号,如下所示:
DOMAIN_NAME="mydomain.com"
sed -i.bak -r 's/^zone "'$DOMAIN_NAME'" \{(.*)\};$//g' /var/zones/master.conf
看到我们应该忽略括号之间的内容,这个块必须替换为"没有"。 我尝试了这个表达式的一些变体,但没有成功。
答案 0 :(得分:2)
也许你可以使用awk?
awk -v dom="mydomain.com" '$2 ~ dom, /^};$/ {next}1' file
,
是范围运算符。第二个字段中dom
的行与仅包含"};"的行之间的范围为true。 next
跳过这些行。剩下的就印了。
使用awk '...' file > tmp && mv tmp file
覆盖原始文件。
答案 1 :(得分: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"
};
答案 2 :(得分:0)
如果它不必是单行,您可以使用'grep'来获取行号,然后使用'sed'从行号中删除整个节。
请参阅Delete specific line number(s) from a text file using sed?