KSH에서 파일 요소 찾기

KSH에서 파일 요소 찾기

내가 뭘 잘못하고 있는지 알아낼 수 있도록 도와주세요.

"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

관련 정보