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 )

おすすめ記事