"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-type
TemplateCode
LOBCODE
XXPO_PHYS_INV_ADJ_ES_AS
xmlstarlet
XMLStarletは時々asの代わりにasとしてインストールされるかもしれませんxml
。
コードには2つの問題があります。
コマンド出力を
sed
というファイルにリダイレクトします$LOBCODE
。空の場合、$LOBCODE
このリダイレクトは失敗します。私はあなたが望むものの出力をsed
変数に割り当てると仮定しますLOBCODE
。これは、上記のようにコマンドの置き換えによって行われます。これはsed
XMLデータを解析するのに適していない選択です。sed
というファイルを使用して、次のタスクを実行するように指示しますfilename
。sed
変数値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