XMLstarlet找不到带有“”的文本

时间:2018-09-21 19:29:49

标签: bash xmlstarlet

我正在通过Bash脚本使用XMLstarlet来搜索在Git中所做的更改,并创建一个仅包含已更改节点的新XML文件。
工作正常,但我无法匹配包含实体"的字符串。

XML如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<CustomLabels xmlns="http://soap.sforce.com/2006/04/metadata">
<labels>
        <fullName>Your_Previously_Selected_Rates_Not_Applicable</fullName>
        <categories>Error</categories>
        <language>en_US</language>
        <protected>false</protected>
        <shortDescription>Your Previously Selected Rates Not Applicable</shortDescription>
        <value>The rate previously selected isn&apos;t eligible. Please click on &quot;Select&quot; to select a new one.</value>
</labels>
</CustomLabels>

以前,我们在&apos;方面遇到问题,但通过在脚本中替换为'来解决此问题。试图用&quot;做同样的事情,而用"代替,但这弄乱了bash中的命令。 我们正在运行的命令是:

xmlstarlet sel -N x="http://soap.sforce.com/2006/04/metadata" -t -c "//x:labels[x:value/text()=\"The rate previsouly selected isn't eligible. Please click on &quot;Select&quot; to select a new one.\"]/x:fullName" -n CustomLabels.labels

任何线索,我可能需要做什么才能找到此文本?

1 个答案:

答案 0 :(得分:1)

这很混乱。

本质上,您必须注意两件事。

  1. 引号
  2. XPath没有转义引号。

诀窍是使用引诱

xmlstarlet sel -N x="http://soap.sforce.com/2006/04/metadata" \
   -t -c "//x:labels[x:value/text()=concat('The rate previously selected isn',\"'\",'t eligible. Please click on \"Select\" to select a new one.')]/x:fullName"

规则是:

  1. 使用双引号定义您的XPath。这样,您仍可以对concat函数使用双引号,而使用单引号。

    ... -t -c "//x:lab...x:fullName"
    
  2. 通过isn't函数中的字符串条目(使用转义的双引号引起来)将concat中的单引号转义。

    ...ted isn',\"'\",'t elig...
    
  3. concat的所有其他条目都写在单引号中,并用bash转义任何双引号:

    ...,'t elig... on \"Select\" to ...