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”{…子网{…}}?在主文件中,辅助故障切换块的结束位置是任意的吗?)你能给我一张吗