将文件中的多行替换为多行

时间:2014-01-15 10:34:43

标签: search replace sed awk lines

我可以用少量命令搜索和替换文件中的多行吗?

我正在尝试将dhcp_primary中的3个故障转移块替换为dhcp_secondarydhcp_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

但我不知道如何继续。

提前致谢。

编辑:我的目标的更多细节。

4 个答案:

答案 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