내가 뭘 잘못하고 있는지 알아낼 수 있도록 도와주세요.
"res.xml"이라는 파일이 있습니다.
<sequence type="a">
<transaction>
<branchSerial>1</branchSerial>
<postingDate>2021-08-02</postingDate>
<postingTime>2021-08-06 19:42:49 UTC</postingTime>
<step type="a">
<record type="c" label="deviceRecord">
<operation option="V">View</operation>
<tableName>DEVICE</tableName>
<tableDescription>Device</tableDescription>
<rowDescription>[email protected]</rowDescription>
</record>
</step>
</transaction>
</sequence>
PostDate를 추출하여 변수에 넣으려고 합니다. 내 스크립트:
#!/bin/ksh
dbDATE=$(sed -n -e "s/<postingDate>\([0-9]*\)<\/postingDate>/\1/p" res.xml)
echo "current DB date: $dbDATE"
실행하면 아무 것도 나오지 않고 공백만 나타납니다.
다른 곳에서도 동일한 논리를 아무런 문제 없이 사용했기 때문에 이것은 이상합니다. 내가 놓친 부분을 누구든지 볼 수 있나요? ? ?
당신이 제공할 수 있는 어떤 도움에도 진심으로 감사드립니다.
답변1
접근 방식의 주요 문제점 sed
은 날짜에 대시가 포함되는 것을 허용하지 않는다는 것입니다.
표시된 파일에서 데이터를 추출하려면 명령줄에서 XML 인식 파서를 사용할 수 있습니다.
이러한 파서의 예는 xmlstarlet
다음과 같이 사용할 수 있다는 것입니다.
dbDATE=$( xmlstarlet sel -t -v '/sequence/transaction/postingDate' res.xml )
또는 찾고 있는 값의 노드가 유일한 노드인 경우,
dbDATE=$( xmlstarlet sel -t -v '//postingDate' res.xml )
XML을 지원하는 또 다른 파서는 다음과 같습니다.xq
, JSON 파서 주변의 XML 파서 래퍼 jq
:
dbDATE=$( xq -r '.sequence.transaction.postingDate' res.xml )
위의 모든 내용은 sequence
노드가 다음을 포함한다고 가정합니다.싱글 transaction
마디. 여러 트랜잭션을 지원하고 싶습니까("시퀀스"라는 단어는 여기에 트랜잭션이 포함될 수 있음을 의미함).목록거래), 선택할지 여부도 결정해야 합니다.첫 번째거래 또는 기타 특정 조건이 부여된 특정 거래.
branchSerial
값이 1
. 인 거래를 원한다고 가정해 보겠습니다. 그리고 xmlstarlet
:
dbDATE=$( xmlstarlet sel -t -v '/sequence/transaction[branchSerial=1]/postingDate' res.xml )
그리고 xq
:
dbDATE=$( xq -r '.sequence.transaction[] | select(.branchSerial == "1").postingDate' res.xml )
답변2
.xml 출력을 변수로 설정한다고 가정하면 다음을 수행할 수 있습니다.
xmlData='
<sequence type="a">
<transaction>
<branchSerial>1</branchSerial>
<postingDate>2021-08-02</postingDate>
<postingTime>2021-08-06 19:42:49 UTC</postingTime>
<step type="a">
<record type="c" label="deviceRecord">
<operation option="V">View</operation>
<tableName>DEVICE</tableName>
<tableDescription>Device</tableDescription>
<rowDescription>[email protected]</rowDescription>
</record>
</step>
</transaction>
</sequence>
'
date=$(echo "$xmlData" | grep "postingDate" | tr '>' " " | tr '<' " " | awk '{print $2}')
파일에서 추출한다고 했으므로 다음과 같이 할 수도 있습니다.
date=$(cat res.xml | grep "postingDate" | tr '>' " " | tr '<' " " | awk '{print $2}')
답변3
다음 명령을 사용하면 잘 작동합니다
dbdate=$(awk -F "[<>]" '/postingDate/{print $3}' res.xml)
echo -e "current DB date: $dbdate"
current DB date: 2021-08-02