Parsing AWK(或类似)-更改匹配图案下方的2行

Parsing AWK(或类似)-更改匹配图案下方的2行,parsing,awk,scripting,insert,Parsing,Awk,Scripting,Insert,我有一个我认为用awk最容易解决的问题,但我对此很在意。 在文件中,我有如下重复输出: .... Name="BgpIpv4RouteConfig_XXX"> <Ipv4NetworkBlock id="13726" StartIpList="x.y.z.t" PrefixLength="30" NetworkCount="10000" ... other output 然后,该块将重复 aI

我有一个我认为用awk最容易解决的问题,但我对此很在意。 在文件中,我有如下重复输出:

....
  Name="BgpIpv4RouteConfig_XXX">
          <Ipv4NetworkBlock id="13726"
           StartIpList="x.y.z.t"
           PrefixLength="30"
           NetworkCount="10000"
... other output
然后,该块将重复

aI希望在BGPIpv4Route.*上匹配,然后跳过2行awk的n关键字,然后在达到前缀长度时: -或者用随机的25,30替换它 或 -更好,但我猜更难,没有想到要跟踪使用了什么,并在/25../30->first occurrence/25、second one/26…到/30之间循环,然后回滚到/25

b然后,根据PrefixCount的新值,使用NetworkCount的下一行将其计算为65536/2^32前缀计数

例如:如果此事件的PrefixCount替换为/25,则它后面一行的NetworkCount=65536/2^7=65536/128=512

我发现了一些例子,在匹配的一行之后插入/更改一行,或者在匹配的下面插入一个计数器变量X行,但是我对值生成部分和两行的更改(其中一行依赖于另一行)有点混淆。 我不确定我说的有什么道理……我的脑子里现在到处都是我发现的东西,有点不知所措

提前谢谢

这样就可以了

$ awk 'BEGIN {q="\""; FS=OFS="="; n=split("25=26=27=28=29=30",ps)}
       /BgpIpv4Route/ {c=c%n+1}
       /PrefixLength/ {$2=q ps[c] q}
       /NetworkCount/ {$2=q 65536/2^(32-ps[c]) q}1' file
可能通过更改为2^ps[c]-16来最小化计算


如果有独立的PrefixLength和NetworkCount属性,您可能需要将它们限定为每个BgpIpv4Route上下文。

谢谢!工作起来很有魅力。我不敢相信这是如此直截了当。我学到了一些新的东西。我现在在想…如果它找到了一个前缀长度条目而没有一个之前的BgpIpv4Route one,这也会引起变化,不是吗?是否有任何方法使其成为仅当其发现前缀长度和网络计数是BgpIpv4Route匹配后的第3行和第4行时才替换前缀长度和网络计数的约束条件?是的,使用上下文开关记录行号,并在模式匹配之外进行比较。