我可以用少量命令搜索和替换文件中的多行吗?
我正在尝试将dhcp_primary
中的3个故障转移块替换为dhcp_secondary
内dhcp_primary
内唯一的故障转移块。
我的目标是将dhcpd.conf从主dhcp复制到辅助站点(更多信息请访问:http://www.madboa.com/geek/dhcp-failover/)。仅当配置相同时,故障转移才起作用,当然除了故障转移块之外;你可以看到网站的例子。 所以我想复制这个文件,但保留来自辅助文件的故障转移信息。
示例dhcp_primary
:
// some lines above
failover peer "A" {
...
}
failover peer "B" {
...
}
failover peer "C" {
...
}
// some lines below
示例dhcp_secondary
:
// some different lines above
failover peer "D" {
...
}
// some different lines below
预期产出必须是:
// some lines above
failover peer "D" {
...
}
// some lines below
我已经可以提取故障转移块了:
awk '/^failover/,/^}$/' dhcp_a
awk '/^failover/,/^}$/' dhcp_b
但我不知道如何继续。
提前致谢。
编辑:我的目标的更多细节。
答案 0 :(得分:2)
您可以尝试:
awk -f a.awk dhcp_b dhcp_a
其中a.awk
是:
/^failover/,/^}$/{
if (NR==FNR) {
blk=blk $0 RS
next
}
if (++i==1) {
printf "%s",blk
}
next
}
NR!=FNR{ print }
答案 1 :(得分:1)
这可能适合你(GNU sed):
sed -n '/^failover peer/,/^}/p' dhcp_b |
sed -e '/^failover peer/,/^}/!b;r /dev/stdin' -e 'd' dhcp_a
答案 2 :(得分:0)
如果文件只是这种结构和内容的种类
NewFile=./FileName
head -1 dhcp_a > ${NewFile}
sed -n '1!{$!p;};}' dhcp_b >> ${NewFile}
tail -1 dhcp_a >> ${NewFile}
只需获取dhcp_a的标题和预告片并阻止dhcp_b的内容
如果文件较大(内容周围)使用/ failover /,/} /之类的内容作为sed中的块分隔符,但它取决于实际内容
答案 3 :(得分:0)
$ cat tst.awk
/^failover/ { inRec = 1 }
{
if (NR == FNR) {
if (inRec) {
rec = rec $0 ORS
}
}
else {
if (inRec) {
printf "%s", rec
rec = ""
}
else {
print
}
}
}
/^}/ { inRec = 0 }
$ awk -f tst.awk secondary primary
// some lines above
failover peer "D" {
...
}
// some lines below