Perl 在比赛后替换第一场比赛

Perl replace first match after match

我有这个文件:

host test-focal1.mydomain.local {
  hardware ethernet 00:00:00:00:00:00;
  fixed-address 192.168.10.10001;
  server-name "192.168.10.100";
  next-server 192.168.10.100;
  filename "pxelinux.0";
  option routers 192.168.10.1;
  option domain-name "mydomain.local";
  option domain-name-servers 192.168.10.100;
  option domain-search "mydomain.local";
  option host-name "test-focal1";
  option subnet-mask 255.255.255.0;
  option root-path "/fai/nfsroot/focal,rsize=1048576,wsize=8192,acregmin=1800,acregmax=1800,acdirmin=1800,acdirmax=1800,vers=3,mountport=614,port=2049,proto=tcp,mountproto=tcp,mountvers=3,nolock,noacl";
  option option-170 "nfs://192.168.10.100/fai/config-focal";
  site-option-space "PXEL";
  option PXEL.magic xx:xx:xx:xx;
  option PXEL.configfile "pxelinux.cfg/fai-focal";
}

host test-jessie1.mydomain.local {
  hardware ethernet 00:50:56:bd:e7:78;
  fixed-address 192.168.10.10002;
  server-name "192.168.10.100";
  next-server 192.168.10.100;
  filename "pxelinux.0";
  option routers 192.168.10.1;
  option domain-name "mydomain.local";
  option domain-name-servers 192.168.10.100;
  option domain-search "mydomain.local";
  option host-name "test-jessie1";
  option subnet-mask 255.255.255.0;
  option root-path "/fai/nfsroot/focal,rsize=1048576,wsize=8192,acregmin=1800,acregmax=1800,acdirmin=1800,acdirmax=1800,vers=3,mountport=614,port=2049,proto=tcp,mountproto=tcp,mountvers=3,nolock,noacl";
  option option-170 "nfs://192.168.10.100/fai/config-focal";
  site-option-space "PXEL";
  option PXEL.magic xx:xx:xx:xx;
  option PXEL.configfile "pxelinux.cfg/fai-focal";
}

host test-wheezy1.mydomain.local {
  hardware ethernet 00:50:56:bd:e7:79;
  fixed-address 192.168.10.10003;
  server-name "192.168.10.100";
  next-server 192.168.10.100;
  filename "pxelinux.0";
  option routers 192.168.10.1;
  option domain-name "mydomain.local";
  option domain-name-servers 192.168.10.100;
  option domain-search "mydomain.local";
  option host-name "test-wheezy1";
  option subnet-mask 255.255.255.0;
  option root-path "/fai/nfsroot/focal,rsize=1048576,wsize=8192,acregmin=1800,acregmax=1800,acdirmin=1800,acdirmax=1800,vers=3,mountport=614,port=2049,proto=tcp,mountproto=tcp,mountvers=3,nolock,noacl";
  option option-170 "nfs://192.168.10.100/fai/config-focal";
  site-option-space "PXEL";
  option PXEL.magic xx:xx:xx:xx;
  option PXEL.configfile "pxelinux.cfg/fai-focal";
}

我需要用 perl 脚本替换 PXEL.configfile 仅针对特定主机的选项值, 例如对于主机 test-focal1.mydomain.local 我需要设置:

host test-focal1.mydomain.local {
  hardware ethernet 00:00:00:00:00:00;
  fixed-address 192.168.10.10001;
  server-name "192.168.10.100";
  next-server 192.168.10.100;
  filename "pxelinux.0";
  option routers 192.168.10.1;
  option domain-name "mydomain.local";
  option domain-name-servers 192.168.10.100;
  option domain-search "mydomain.local";
  option host-name "test-focal1";
  option subnet-mask 255.255.255.0;
  option root-path "/fai/nfsroot/focal,rsize=1048576,wsize=8192,acregmin=1800,acregmax=1800,acdirmin=1800,acdirmax=1800,vers=3,mountport=614,port=2049,proto=tcp,mountproto=tcp,mountvers=3,nolock,noacl";
  option option-170 "nfs://192.168.10.100/fai/config-focal";
  site-option-space "PXEL";
  option PXEL.magic xx:xx:xx:xx;
  option PXEL.configfile "pxelinux.cfg/test-focal";
}

我试过这段代码但不起作用:

`sed -i '/host test-focal1/,/./ s/fai-focal/test-focal1/1' dhcpd.conf`;

正确的命令是什么? 谢谢

这可能适合您 (GNU sed):

sed -E '/host test-focal/{:a;N;/}$/!ba;s/fai(-focal)/test/}' file

收集包含 host test-focal 的行和结束 } 的行之间的行,然后将 fai-focal 替换为 test-focal

怎么样

perl -pi -e 's/fai-focal/test-focal1/ if /^host test-focal/ .. /^}/' infile

使用 flip-flop operator.

我用下面的命令解决了:

`sed -i '/host $fqdn/,/fai-focal/ s/fai-focal/$fqdn/1' dhcpd.conf`;