繁体   English   中英

用sed替换区域文件中的序列号

[英]Replace serial in zone files with sed

我需要替换区域文件中的序列号,我认为最简单的方法是使用sed来改变它。 我有以下一行来测试。

@ IN SOA    ns1.domain.com. webdev.domain.com. (
        2006080401  ; serial
        8H      ; refresh
        2H      ; retry
        1W      ; expire
        4h)     ; minimum ttl

        NS  ns1.domain.com.
        NS  ns2.domain.com.
        MX 10   mail1.domain.com.
        MX 20   mail2.domain.com.

domain.com.      A   255.255.255.255
mail1           A   255.255.255.255
mail2           A   10.10.10.10

www         CNAME   domain.com.
ftp         CNAME   www
webmail     CNAME   www

我使用http://rubular.com/创建的正则表达式如下。 在rebular上,我得到的正则表达式只匹配一行。

\\s*[0-9] \\s ;\\s*serial

所以在sed中我会使用如下。

sed -i 's/\\s*[0-9] \\s ;\\s*serial/20091218 ; serial/g' *.zone

我的问题是,这不会改变文件中的任何内容。 我已经尝试了好几件事。 谢谢你的帮助

在第二个“\\ s”之后看起来你需要一个星号

sed -i 's/\s*[0-9]\s*;\s*serial/20091218 ; serial/' *.zone

在那里放置更多东西可能不会有什么坏处:

sed -i 's/^\s*[0-9]\s*;\s*serial\s$/20091218 ; serial/' *.zone

我拿出了“g”,因为你可能不会在一行上出现多次。

如果您不关心保留领先的空间,您可以简单地做:

awk '/serial/{$1=20091218}1'

结果1

@ IN SOA    ns1.domain.com.     webdev.domain.com. (
20091218 ; serial
        8H              ; refresh

另一方面,如果让串口排队对你很重要,你可以这样做:

awk '/serial/{printf "%8s%-16s; %s\n"," ",20091218,$3;next}1'

结果2

@ IN SOA    ns1.domain.com.     webdev.domain.com. (
        20091218        ; serial
        8H              ; refresh

只要保持序列号小于16位,这将完美排列。

这是一个适合我的perl方法:

cat /var/named/zonefile.db | perl -e "while(<>){ s/\d+(\s*;\s*[sS]erial)/20091218\1/; print; }"

保留领先的空间。

您的sed模式只查找一位数。 这对我有用:

sed -i 's/\s*[0-9]\+\s;\s*serial/20091218 ; serial/g' *.zone && cat *.zone
awk -F"," '/serial$/{$0="20091218 ; serial"}1' OFS="," file

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM