Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 将一个文件中的多行替换为另一个文件中的多行_Search_Replace_Sed_Awk_Lines - Fatal编程技术网

Search 将一个文件中的多行替换为另一个文件中的多行

Search 将一个文件中的多行替换为另一个文件中的多行,search,replace,sed,awk,lines,Search,Replace,Sed,Awk,Lines,我可以用几个命令搜索和替换文件中的多行吗 我正在尝试用dhcp\u primary中的dhcp\u secondary中的唯一故障切换块替换dhcp\u primary中的3个故障切换块 我的目标是将dhcpd.conf从主dhcp复制到辅助dhcp(更多信息如下:)。只有在配置相同时,故障转移才会工作,当然,故障转移块除外;正如你所看到的,这是网站的例子。 因此,我希望复制此文件,但保留来自辅助服务器的故障转移信息 示例dhcp_主: // some lines above failover

我可以用几个命令搜索和替换文件中的多行吗

我正在尝试用
dhcp\u primary
中的
dhcp\u secondary
中的唯一故障切换块替换
dhcp\u primary
中的3个故障切换块

我的目标是将dhcpd.conf从主dhcp复制到辅助dhcp(更多信息如下:)。只有在配置相同时,故障转移才会工作,当然,故障转移块除外;正如你所看到的,这是网站的例子。 因此,我希望复制此文件,但保留来自辅助服务器的故障转移信息

示例<代码>dhcp_主:

// some lines above
failover peer "A" {
...
}
failover peer "B" {
...
}
failover peer "C" {
...
}
// some lines below
// some different lines above
failover peer "D" {
...
}
// some different lines below
示例<代码>dhcp_次要:

// some lines above
failover peer "A" {
...
}
failover peer "B" {
...
}
failover peer "C" {
...
}
// some lines below
// 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
但我不知道如何继续

提前谢谢


编辑:有关我的目标的更多详细信息。

如果文件仅具有这种结构和内容类型

NewFile=./FileName

head -1 dhcp_a > ${NewFile}
sed -n '1!{$!p;};}' dhcp_b >> ${NewFile}
tail -1 dhcp_a >> ${NewFile}
只需获取dhcp_a的头和尾,并阻止dhcp_b的内容


如果文件较大(周围的内容),则在sed中使用类似/failover/,/}/的块分隔符,但如果文件仅为这种结构和内容类型,则它取决于实际内容

NewFile=./FileName

head -1 dhcp_a > ${NewFile}
sed -n '1!{$!p;};}' dhcp_b >> ${NewFile}
tail -1 dhcp_a >> ${NewFile}
只需获取dhcp_a的头和尾,并阻止dhcp_b的内容


如果文件较大(周围的内容),则在sed中使用类似/failover/,/}/的块分隔符,但如果文件仅为这种结构和内容类型,则它取决于实际内容

NewFile=./FileName

head -1 dhcp_a > ${NewFile}
sed -n '1!{$!p;};}' dhcp_b >> ${NewFile}
tail -1 dhcp_a >> ${NewFile}
只需获取dhcp_a的头和尾,并阻止dhcp_b的内容


如果文件较大(周围的内容),则在sed中使用类似/failover/,/}/的块分隔符,但如果文件仅为这种结构和内容类型,则它取决于实际内容

NewFile=./FileName

head -1 dhcp_a > ${NewFile}
sed -n '1!{$!p;};}' dhcp_b >> ${NewFile}
tail -1 dhcp_a >> ${NewFile}
只需获取dhcp_a的头和尾,并阻止dhcp_b的内容

如果文件较大(周围的内容),请在sed中使用像/failover/,/}/这样的块分隔符,但它取决于实际内容,这可能适合您(GNU-sed):

这可能适用于您(GNU-sed):

这可能适用于您(GNU-sed):

这可能适用于您(GNU-sed):

您可以尝试:

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 }
您可以尝试:

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 }
您可以尝试:

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 }
您可以尝试:

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 }


我不熟悉故障切换块。编号
111
222
的用途是什么?
dhcp_a
dhcp_b
是两个独立的文件,还是在同一个文件中的块?这里,数字111和222代表替换一些行。故障转移将一个块置于另一个块之下,其间没有任何线,但这些块上方有一些线,而这些块下方有一些线。dhcp_a和dhcp_b是分开的文件。在给定的故障转移块中可以有嵌套的大括号吗?像故障转移对等方“D”{…子网{…}}?在主文件中,辅助故障切换块的结束位置是任意的吗?(例如,可以在文件的开头使用它吗?)不要在awk中使用像
'/a/,/b/“
这样的范围,因为它们使琐碎的解决方案稍微简单一些,但当它变得稍微复杂时,需要完全重写。只需使用
'/a/{f=1}f/b/{f=0}'
,然后您可以完全控制,例如,要打印的终止行、需要测试的其他条件,并且最终不必重新测试相同的条件(这是
“/a/,/b/”
方法的常见问题)。例如,为了不打印终止匹配行-'/a/,/b/{if(!/b/)print}'vs
'/a/{f=1}/b/{f=0}f'
@EdMorton是的,我也刚刚发现范围表达式不是很灵活。我不熟悉故障转移块。编号
111
222
的用途是什么?
dhcp_a
dhcp_b
是两个独立的文件,还是在同一个文件中的块?这里,数字111和222代表替换一些行。故障转移将一个块置于另一个块之下,其间没有任何线,但这些块上方有一些线,而这些块下方有一些线。dhcp_a和dhcp_b是分开的文件。在给定的故障转移块中可以有嵌套的大括号吗?像故障转移对等方“D”{…子网{…}}?在主文件中,辅助故障切换块的结束位置是任意的吗?(例如,可以在文件的开头使用它吗?)不要在awk中使用像
'/a/,/b/“
这样的范围,因为它们使琐碎的解决方案稍微简单一些,但当它变得稍微复杂时,需要完全重写。只需使用
'/a/{f=1}f/b/{f=0}'
,然后您可以完全控制,例如,要打印的终止行、需要测试的其他条件,并且最终不必重新测试相同的条件(这是
“/a/,/b/”
方法的常见问题)。例如,为了不打印终止匹配行-'/a/,/b/{if(!/b/)print}'vs
'/a/{f=1}/b/{f=0}f'
@EdMorton是的,我也刚刚发现范围表达式不是很灵活。我不熟悉故障转移块。编号
111
222
的用途是什么?
dhcp_a
dhcp_b
是两个独立的文件,还是在同一个文件中的块?这里,数字111和222代表替换一些行。故障转移将一个块置于另一个块之下,其间没有任何线,但这些块上方有一些线,而这些块下方有一些线。dhcp_a和dhcp_b是分开的文件。在给定的故障转移块中可以有嵌套的大括号吗?像故障转移对等方“D”{…子网{…}}?在主文件中,辅助故障切换块的结束位置是任意的吗?)你能给我一张吗