用sed替换整个短语

时间:2014-10-02 18:14:27

标签: regex bash shell sed sh

在添加和删除区域引用时,我使用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

看到我们应该忽略括号之间的内容,这个块必须替换为"没有"。 我尝试了这个表达式的一些变体,但没有成功。

3 个答案:

答案 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?