【问题标题】:resetting a flag in awk在 awk 中重置标志
【发布时间】:2012-02-22 22:10:13
【问题描述】:

我有以下使用 awk 的函数:

getStageMode() {
targ=$1; shift
       mode=$(awk '
        /[<]app-deployment/{a=1}
        a && /[<]name[>]'"${targ}[<]"'/{n=1}
        a && n && /[<]staging-mode[>]/{ 
          sub(/[<]staging-mode[>]/,"", $0)
          sub(/[<]\/staging-mode[>]/,"",$0)
          print $0
          exit
        }
        {print "n=" n }
        ' "${@}")
echo $mode
}

在将 n 标志设置为 1 后,我无法休息。哪里是重置它的合适位置?

【问题讨论】:

标签: linux shell scripting awk


【解决方案1】:
/[<]\/app-deployment/{a=0; n=0}

所以,你会:

getStageMode() {
targ=$1; shift
   mode=$(awk '
    /[<]\/app-deployment/{a=0; n=0}
    /[<]app-deployment/{a=1}
    a && /[<]name[>]'"${targ}[<]"'/{n=1}
    a && n && /[<]staging-mode[>]/{ 
      sub(/[<]staging-mode[>]/,"", $0)
      sub(/[<]\/staging-mode[>]/,"",$0)
      print $0
      exit
    }
    {print "n=" n }
    ' "${@}")
echo $mode
}

解释: OP 有一个带有 XML 节点的生成文件,例如:

<app-deployment>
    <name>gr2</name>
    <target>AdminServer</target>
    <module-type>ear</module-type>
    <source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
    <security-dd-model>DDOnly</security-dd-model>
    <staging-mode>nostage</staging-mode>
</app-deployment>  
<app-deployment>
    <name>gr3</name>
    <target>AdminServer</target>
    <module-type>ear</module-type>
    <source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
    <security-dd-model>DDOnly</security-dd-model>
</app-deployment>

当我们在app-deployment XML 节点内时,AWK 脚本设置a,当该节点具有我们正在寻找的name 时设置n。由于某些节点没有staging-mode,原始的AWK(既没有重置a也没有重置n)可以为下一个节点返回staging-mode。退出节点时重置这些变量应该可以解决该问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2013-12-24
    相关资源
    最近更新 更多