ファイル名にスペースを含むファイルからxmlタグ値を抽出する

ファイル名にスペースを含むファイルからxmlタグ値を抽出する

"EXXARS - 実際の在庫調整レポート US PDF_es_ES.xlf" ファイルがあります。

ファイルデータ:

<header>
 <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
 </prop-group>

抽出と結果の間の値が必要です。 XXPO_PHYS_INV_ADJ_ES_ES変数にはこの値が必要です。

コマンドは機能しません。

filename='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
sed -n 's:.*<prop prop-type="TemplateCode">\(.*\)</prop>.*:\1:p' filename > ${LOBCODE}
echo " --> ${LOBCODE}"

ベストアンサー1

XMLファイルの形式が正しいと仮定します。

<?xml version="1.0"?>
<header>
  <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
  </prop-group>
</header>

使用XMLスター:

xmlfile='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$( xml sel -t -v '//prop[@prop-type="TemplateCode"]' "$xmlfile" )

これはXMLStarletを使用して、prop属性が次のノードの値を抽出します。この変数は上記のXMLを介して値を取得します。prop-typeTemplateCodeLOBCODEXXPO_PHYS_INV_ADJ_ES_AS

xmlstarletXMLStarletは時々asの代わりにasとしてインストールされるかもしれませんxml


コードには2つの問題があります。

  1. コマンド出力をsedというファイルにリダイレクトします$LOBCODE。空の場合、$LOBCODEこのリダイレクトは失敗します。私はあなたが望むものの出力をsed変数に割り当てると仮定しますLOBCODE。これは、上記のようにコマンドの置き換えによって行われます。これはsedXMLデータを解析するのに適していない選択です。

  2. sedというファイルを使用して、次のタスクを実行するように指示しますfilenamesed変数値 filename$変数名の前に使用する必要があります。また、ファイル名にスペースがあるため、二重引用符変数の拡張が必要です(いつもとにかくそうしなさい)。したがって、使用する必要があります"$filename"(上記のコードでは、より説明的な変数名を使用しました)。

おすすめ記事