linux - 在 awk 中重置标志

标签 linux shell scripting awk

我有以下使用 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 后,我无法重置它。重置它的正确位置在哪里?

最佳答案

/[<]\/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,当该节点具有 时设置 n name 我们正在寻找。由于一些节点没有 staging-mode,原始 AWK,它既没有重置 a 也没有 n,可以返回 以下节点的暂存模式。在退出节点时重置这些变量应该可以解决该问题。

关于linux - 在 awk 中重置标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9403904/

相关文章:

linux - 带有 "while"循环和数字测试的 shell 脚本不起作用

linux - OpenPose 库 - 构建发布问题

linux - 在 Linux 和 OSX 上用唯一的 uuid 替换每个匹配的字符串值

linux - Windows 操作系统使用哪种语言进行编码?

java - Qsub 与作业脚本与输入

bash - 如何为列表项生成唯一编号

powershell - PSObject 和 PSAdapted 之间的差异

windows - Windows 上的关机脚本删除注册表项?

windows - 在 PowerShell v2 中打破 foreach 循环

linux - linux下用户号和组号不匹配