Ksh

從文件名有空格的文件中提取 xml 標記值

  • November 18, 2018

我有一個文件“EXXARS - 美國實物庫存調整報告 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}"

假設 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>

使用XMLStarlet

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而不是xml.


您的程式碼有兩個問題:

  1. 您將sed命令的輸出重定向到名稱由 給出的文件$LOBCODE。如果$LOBCODE為空,則此重定向將失敗。我假設您想要做的是將 的輸出分配給sed變數LOBCODE。如上所示,這是通過命令替換完成的。請注意,這sed是解析 XML 數據的工具的糟糕選擇。
  2. 您指示sed使用名為filename. 要sed處理變數的值, filename您需要$在變數名前面使用。此外,由於文件名中有空格,因此您需要對變數擴展加雙引號(無論如何,您都應該這樣做)。因此您應該使用"$filename"(我在上面的程式碼中使用了更具描述性的變數名稱)。

引用自:https://unix.stackexchange.com/questions/427624