![AWK를 사용하여 XML 구문 분석](https://linux55.com/image/150922/AWK%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20XML%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D.png)
아래 표시된 문자열에는 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"