2012-02-13 31 views
0

说我有下面的XML提取标签:在shell脚本的另一个标签相同级别的

<app-deployment> 
    <name>gr1</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>stage</staging-mode> 
</app-deployment> 
<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> 

我怎样才能提取分期模式变量的值,说名为应用程序部署GR2?

+0

没有perl的解决方案请,因为我是局限于只用shell脚本解决方案,如用sed,awk中,等 – Codrguy 2012-02-13 23:24:27

+0

和您的XML将始终作为完全格式化如上你的样品? – shellter 2012-02-13 23:56:30

+0

是的,它是由另一个脚本生成的xml,所以格式将永远是相同的 – Codrguy 2012-02-14 00:08:28

回答

1

许多人(包括我自己)会告诉你,使用基于reg-ex的工具来分析xml是愚蠢的任务,并且你应该使用为xml解析而设计的工具。 Xpath应该为此工作,而xmlstarlet将是一个可以快速安装和使用的软件包。这就是说,假设你的数据总是能够很好地形成,那么制作一个awk脚本来搜索1个模式,设置一个标志,查找另一个模式,设置一个标志等是很容易的。当您找到最终目标时,清理该行以提取所需的数据。

set -- gr2 
{ cat - <<-EOS 
<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> 
EOS 
} | awk ' 
    /[<]app-deployment/{a=1} 
    a && /[<]name[>]'"$1"'/{n=1} 
    a && n && /[<]staging-mode[>]/{ 
     sub(/[<]staging-mode[>]/,"", $0) 
     sub(/[<]\/staging-mode[>]/,"",$0) 
     print $0 
     exit 
    } 
    #dbg { print "a=" a "\tn=" n } 
    ' 

输出

 nostage 

set -- gr3{ cat ... } |是一个测试工具,你会包装,这是一个shell脚本,即

cat printXMLarg.bash 
#!/bin/bash 
    targ=$1; shift 
    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 
    } 
    #dbg { print "a=" a "\tn=" n } 
    ' "${@}" 

,并呼吁像

printXMLarg.bash gr3 *.xml 

第二部分未经测试。让我知道你是否有问题。

我希望这有助于

+0

非常感谢。这很好。我想使用sed或awk的原因是,我不知道在这个脚本将要使用的Linux机器上将有什么类型的软件包可用。所以我想,既然awk和sed总是会在那里,这是我的情况。再次感谢您的回答。 – Codrguy 2012-02-14 01:01:30

+0

有没有办法改变上面的脚本,因为它没有staging-mode标签,所以在传递grc3时(在我的问题中是例子xml的情况下)什么都不返回?目前它由于某种原因返回nostage。 – Codrguy 2012-02-14 01:28:41

+0

固定,我想。否则,请告知我。晚安。 – shellter 2012-02-14 03:50:44

相关问题