сбросить флаг в awk - PullRequest
       15

сбросить флаг в awk

1 голос
/ 23 февраля 2012

У меня есть следующая функция, которая использует 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. Где находится правильное место для его сброса?

1 Ответ

2 голосов
/ 23 февраля 2012
/[<]\/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>

AWKскрипт устанавливает a, когда мы находимся внутри app-deployment XML-узла, и n, когда у этого узла есть name, который мы ищем.Поскольку некоторые узлы не имеют staging-mode, исходный AWK, который не сбрасывал ни a, ни n, мог вернуть staging-mode для следующего узла.Сброс этих переменных при выходе из узла должен исправить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...