![从文件名包含空格的文件中提取 xml 标记值](https://linux22.com/image/128768/%E4%BB%8E%E6%96%87%E4%BB%B6%E5%90%8D%E5%8C%85%E5%90%AB%E7%A9%BA%E6%A0%BC%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%E6%8F%90%E5%8F%96%20xml%20%E6%A0%87%E8%AE%B0%E5%80%BC.png)
我有一个文件“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 中的该值。
我有 cocomand 不工作
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
而不是安装为xml
。
您的代码有两个问题:
您将命令的输出重定向
sed
到名称由 指定的文件$LOBCODE
。如果$LOBCODE
为空,则此重定向将失败。我假设您想要做的是将 的输出分配sed
给变量LOBCODE
。这是通过命令替换完成的,如我上面所示。请注意,对于解析 XML 数据来说,这sed
是一个糟糕的选择。您指示
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 的方法假设您想要任何prop
具有“TemplateCode”属性的元素:哪种方法更可取取决于您的数据。 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