我有一个像下面的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命令在单独的变量中提取每个标记值的值。怎么做?
答案 0 :(得分:17)
您可以使用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
答案 1 :(得分:3)
以下gawk命令使用记录分隔符regex模式来匹配XML标记。任何以&lt;开头的东西然后是至少一个非>并由&gt;终止被认为是一个标签。 Gawk将每个RS匹配分配给RT变量。标签之间的任何内容都将被解析为gawk分配给$ 0的记录文本。
gawk 'BEGIN { RS="<[^>]+>" } { print RT, $0 }' myfile
答案 2 :(得分:0)
下面的代码将所有标记值存储在数组中!希望这会有所帮助。 但我仍然相信这不是一种最佳方式。
> 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