使用 AWK 解析 XML

使用 AWK 解析 XML

我只需要下面所示字符串中 ANSI 格式日期 (YYYY-MM-DD) 的第一个实例。

PosMntReq ReqId="XXXXX" TxnTyp="4" Actn="1" BizDt="2019-03-27" TxnTm="2019-03-27T10:41:13" AdjTyp="3" SetSesID="EOD">

我用 awk 编写的命令不提供日期

v_business_date=$(awk -F= 'NR==4 { print $5}' XMLCD02)

bash-4.2$ echo $v_business_date
"2019-03-27" TxnTm

带日期的行会在文件中多次出现;我想要这行的第一次出现。

答案1

对您的数据做出一些假设:

$ cat file.xml
<root>
  <node1>
    <node2 ReqId="XXXXX" TxnTyp="4" Actn="1" BizDt="2019-03-27" TxnTm="2019-03-27T10:41:13" AdjTyp="3" SetSesID="EOD"> 
    </node2>
  </node1>
</root>

$ txn_tm=$( xmlstarlet sel -t -v '//node2/@TxnTm' file.xml )

$ echo "$txn_tm"
2019-03-27T10:41:13

如果要根据ReqId选择节点,那么我们需要调整xpath:为任何具有指定“ReqId”属性的节点返回“TxnTm”属性值。

xmlstarlet sel -t -v '//*[@ReqId = "XXXXX"]/@TxnTm' -n file.xml

答案2

不要使用正则表达式来解析 XML。那就是疯狂。但如果你坚持要陷入疯狂和小马:

sed -En '/TxnTm=/{s/^.*TxnTm="//;s/T[0-9:]+".*$//;p;q;}' < inputfile

答案3

一个更简单的选择是仅使用grep,尽管再次提出使用正则表达式工具解析 XML 或 XHTML 的建议是通往悲伤之城的单程票:

$ grep -m1 -oE '"[0-9]{4}-[0-9]{2}-[0-9]{2}"' input
"2019-03-27"

相关内容