【发布时间】:2014-02-03 18:49:47
【问题描述】:
我可以在几个命令中搜索和替换文件中的多行吗?
我正在尝试用来自dhcp_secondary 的唯一故障转移块替换来自dhcp_primary 的3 个故障转移块,在dhcp_primary 内。
我的目标是将 dhcpd.conf 从主 dhcp 复制到辅助 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
但我不知道如何继续。
提前致谢。
编辑:我的目标的更多细节。
【问题讨论】:
-
我不熟悉故障转移块。数字
111和222的用途是什么?dhcp_a和dhcp_b是两个单独的文件,还是在同一个文件中块? -
这里,数字 111 和 222 代表替换一些行。故障转移块一个在另一个之下,中间没有任何线,但是这些块上方有一些线,这些块下方有一些线。而dhcp_a和dhcp_b是分开文件的。
-
在给定的故障转移块中可以有嵌套的大括号吗?喜欢
failover peer "D" { ... subnet { ... } }?辅助故障转移块在主文件中的位置是否任意? (例如,你能把它放在文件的开头吗?) -
永远不要在 awk 中使用像
'/a/,/b/'这样的范围,因为它们使琐碎的解决方案稍微简单一些,但是当它变得稍微复杂一些时,就需要完全重写。只需改用'/a/{f=1} f; /b/{f=0}',然后您就可以完全控制要打印的终止行、需要测试的其他条件,并且您最终不必重新测试相同的条件(a'/a/,/b/'方法的常见问题)。例如,不打印终止匹配行 - '/a/,/b/{ if (!/b/) print }' vs'/a/{f=1} /b/{f=0} f'. -
@EdMorton 是的,我也刚刚发现范围表达式不是很灵活..
标签: search replace sed awk lines