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
我用下面的命令解决了:
`sed -i '/host $fqdn/,/fai-focal/ s/fai-focal/$fqdn/1' dhcpd.conf`;
我有这个文件:
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
我用下面的命令解决了:
`sed -i '/host $fqdn/,/fai-focal/ s/fai-focal/$fqdn/1' dhcpd.conf`;