ファイル名にスペースを含むファイルから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"(上記のコードでは、より説明的な変数名を使用しました)。

答え2

@Kusalanandaの答えはとても素晴らしいですが、答えがあればxmllint次のことができます。

filename='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$(xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@prop-type='TemplateCode']/text()" "$filename")

メモ:

  • prop-group「ora-reconstruction」属性のみが必要な場合に備えて、フルパス仕様を使用しました。 @Kusalanandaのアプローチは、「TemplateCode」属性を持つ要素が欲しいと仮定しますprop。どのアプローチが好まれるかは、データによって異なります。
  • text()要素内のテキストのみが返されますprop。それ以外の場合、xmllint周辺要素も返されます。

重要な部分を使った実行例:

$ xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@proptype='TemplateCode']/text()" "ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf"
XXPO_PHYS_INV_ADJ_ES_AS

答え3

$ cat test.xml
<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>

$ awk -F"[<>]" '/TemplateCode/{print $3;exit}' test.xml
XXPO_PHYS_INV_ADJ_ES_AS

関連情報