Regex 用sed替换区域内的串行文件

Regex 用sed替换区域内的串行文件,regex,bash,sed,Regex,Bash,Sed,我需要替换我的区域文件中的序列,我认为最简单的方法是使用sed来更改它。我有以下几行要测试 @ IN SOA ns1.domain.com. webdev.domain.com. ( 2006080401 ; serial 8H ; refresh 2H ; retry 1W ; expire 4h) ; minimum ttl NS ns1.doma

我需要替换我的区域文件中的序列,我认为最简单的方法是使用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 @在SOA ns1.domain.com中。webdev.domain.com。( 200608041;序列号 8H;刷新 2H;重试 1W;过期 4h);最小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 邮寄1 A 255.255.255.255 邮寄2 A 10.10.10.10 www.CNAME domain.com。 ftp CNAME www 网络邮件CNAME www 我使用的正则表达式如下所示。在rebular上,regex只能匹配一行

\s*[0-9]\s\s*序列号

因此,在sed中,我将使用以下方法

sed-i的/\s*[0-9]\s\s*序列号/20091218;序列/g'*.区域


我的问题是,这不会改变文件中的任何内容。我已经试过几种方法了。谢谢您的帮助

第二个“\s”后面似乎需要一个星号

在里面再放几样东西也没什么坏处:

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

我去掉了“g”,因为一行中可能不会出现多个引用。

如果不想保留前导空格,可以简单地执行以下操作:

awk '/serial/{$1=20091218}1'
结果1 结果2 @在SOA ns1.domain.com中。webdev.domain.com。( 20091218;序列号 8H;刷新
只要序列号小于16位,就可以完美地排列起来。

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

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

下面是一个对我来说非常有效的perl方法:

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

保留前导空格。

发现了我的问题,实际上这只是我使用的sed和egrep的旧版本。我认为自2003年以来正则表达式没有太大变化:)谢谢你的回答。代码很棒,谢谢。下面是一个递归地在目录中移动并替换每个文件中的串行文件的版本:
find-键入f-print0 | xargs-0awk'/serial/{printf”%6s%-18s;%s\n“,”,2014121101,$3;next}1'
@ IN SOA ns1.domain.com. webdev.domain.com. ( 20091218 ; serial 8H ; refresh
awk '/serial/{printf "%8s%-16s; %s\n"," ",20091218,$3;next}1'
@ IN SOA ns1.domain.com. webdev.domain.com. ( 20091218 ; serial 8H ; refresh
sed -i 's/\s*[0-9]\+\s;\s*serial/20091218 ; serial/g' *.zone && cat *.zone
awk -F"," '/serial$/{$0="20091218 ; serial"}1' OFS="," file