我只需要下面所示字符串中 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"