使用 awk 命令提取 xml 标记值
Posted
技术标签:
【中文标题】使用 awk 命令提取 xml 标记值【英文标题】:Extract xml tag value using awk command 【发布时间】: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 不好。 【参考方案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
【讨论】:
以上是关于使用 awk 命令提取 xml 标记值的主要内容,如果未能解决你的问题,请参考以下文章
如何用awk命令提取文件中的某一列并统计该列中某个数字出现的次数?
使用 bash 命令 awk sed 等从脚本中提取参数字段