【问题标题】:Extract xml tag value using awk command使用 awk 命令提取 xml 标记值
【发布时间】:2012-12-12 19:34:03
【问题描述】:

我有一个像下面这样的 xml

<root>    
<FIToFICstmrDrctDbt>
            <GrpHdr>
                <MsgId>A</MsgId>
                <CreDtTm>2001-12-17T09:30:47</CreDtTm>
                <NbOfTxs>0</NbOfTxs>
                <TtlIntrBkSttlmAmt Ccy="EUR">0.0</TtlIntrBkSttlmAmt>
                <IntrBkSttlmDt>1967-08-13</IntrBkSttlmDt>
                <SttlmInf>
                    <SttlmMtd>CLRG</SttlmMtd>
                    <ClrSys>
                        <Prtry>xx</Prtry>
                    </ClrSys>
                </SttlmInf>
                <InstgAgt>
                    <FinInstnId>
                        <BIC>AAAAAAAAAAA</BIC>
                    </FinInstnId>
                </InstgAgt>
            </GrpHdr>
    </FIToFICstmrDrctDbt>
</root>

我需要使用 awk 命令在单独的变量中提取每个标记值的值。怎么办?

【问题讨论】:

  • 使用正则表达式解析 XML 不好。

标签: xml shell unix awk aix


【解决方案1】:

您可以使用awk,如下所示,但是,这不是一个可靠的解决方案,如果 xml 格式不正确,例如如果同一行有多个元素。

$ dt=$(awk -F '[<>]' '/IntrBkSttlmDt/{print $3}' file)
$ echo $dt
1967-08-13

我建议你使用合适的xml处理工具,比如xmllint

$ dt=$(xmllint --shell file <<< "cat //IntrBkSttlmDt/text()" | grep -v "^/ >")
$ echo $dt
1967-08-13

【讨论】:

    【解决方案2】:

    以下 gawk 命令使用记录分隔符正则表达式模式来匹配 XML 标记。任何以 并以 > 结尾的东西都被认为是标签。 Gawk 将每个 RS 匹配分配给 RT 变量。标签之间的任何内容都将被解析为 gawk 分配给 $0 的记录文本。

    gawk 'BEGIN { RS="<[^>]+>" } { print RT, $0 }' myfile
    

    【讨论】:

      【解决方案3】:

      下面的代码将所有标签值存储在一个数组中!希望这会有所帮助。 但我仍然相信这不是最佳方式。

      > perl -lne 'if(/>[^<]*</){$_=~m/>([^<]*)</;push(@a,$1)}if(eof){foreach(@a){print $_}}' temp
      A
      2001-12-17T09:30:47
      0
      0.0
      1967-08-13
      CLRG
      xx
      AAAAAAAAAAA
      

      【讨论】:

        猜你喜欢
        • 2012-03-06
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 2021-01-29
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        相关资源
        最近更新 更多