【问题标题】:Using sed to replace entire phrase使用 sed 替换整个短语
【发布时间】:2014-11-27 19:17:12
【问题描述】:

在添加和删除区域引用时,我正在使用 ShellScript 编辑我的绑定 dns 配置文件。 然后在“master.conf”文件中我们有这个内容:

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

我想使用“sed”将此条目“删除”到“mydomain.com”,但我无法为此编写正确的正则表达式。表达式必须使用可变域名并搜索到下一个右括号和分号,如下所示:

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

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

【问题讨论】:

  • 相当危险的正则表达式,因为(.*) 会吸收所有内容,直到文件中的LAST }。您可能会破坏文件中的所有区域。
  • @将其仅标记到下一个右括号。我已经从问题中更改了文本。感谢您的留言。

标签: regex bash shell sed sh


【解决方案1】:

也许你可以使用 awk?

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

, 是范围运算符。在第二个字段中带有dom 的行与仅包含“};”的行之间的范围为真。 next 跳过这些行。其余的都打印出来了。

使用awk '...' file > tmp && mv tmp file 覆盖原始文件。

【讨论】:

  • 是的,我可以使用 awk。但是当我尝试你的提示时,结果输出是记录条目。在我的问题中,我想从文件中删除这块文本,用''(空字符串)替换它。
  • 脚本的全部意义在于它跳过了条目(这就是next 所做的)。使用您的示例输入对我有用。
  • Tom,您的解决方案也运行良好,并且在我的脚本中更加优雅。我对我之前的评论很仓促。坦克很多。
【解决方案2】:

试试下面的 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"

    };

【讨论】:

  • 只有一件事,右括号后有一个换行符。我应该在正则表达式中输入哪个字符来删除这个换行符?我尝试了 \n 和 [\n] 但没有删除线。
【解决方案3】:

如果不必是单行,您可以使用 'grep' 获取行号,然后使用 'sed' 从行号中删除整个节。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2020-06-04
    • 2012-07-18
    • 2021-10-08
    相关资源
    最近更新 更多