Xmlstarlet select 用于更新的字符串+数字

Xmlstarlet select String+number for update

我想用一些动态名称更新我的 xml-File 中的一个元素。 名称 (paraName) 始终是 GLOBPARA 后跟一个数字,如下例所示。这些是我要更改值的元素。

该文件还填充了一些元素,这些元素也以 GLOBPARA 开头,但后面没有简单的数字。这些元素我不想改变。

使用以下命令我可以更改名称中包含 GLOBPARA 的每个元素。包括不需要的。 xmlstarlet ed --update "//globPara[contains(paramName, 'GLOBPARA')]/paramValue" -v "100" test.xml

问题: 如何只更改包含字符串 (GLOBPARA) 和一些随机数的那些?

之前:

<?xml version="1.0" encoding="UTF-8"?>
<container>
  <dataList>
    <globPara>
      <paramName>GLOBPARA260</paramName>
      <paramValue>0</paramValue>
    </globPara>
    <globPara>
      <paramName>GLOBPARAMON_BAD_TEST_18_1_SGB_IV</paramName>
      <paramValue>2555</paramValue>
    </globPara>
  </dataList>
</container>

想要的结果:

<?xml version="1.0" encoding="UTF-8"?>
<container>
  <dataList>
    <globPara>
      <paramName>GLOBPARA260</paramName>
      <paramValue>100</paramValue>
    </globPara>
    <globPara>
      <paramName>GLOBPARAMON_BAD_TEST_18_1_SGB_IV</paramName>
      <paramValue>2555</paramValue>
    </globPara>
  </dataList>
</container>

我用正则表达式 d+ 试过了,但没用。

xmlstarlet ed --update "//globPara[contains(paramName, 'GLOBPARA[\d+]')]/paramValue" -v "100" test.xml

你可以试试下面的 XPath

//globPara[number(substring-after(paramName, 'GLOBPARA'))>=0]/paramValue

这将 return 您 paramValueglobPara 节点包含 paraName 子节点,文本格式为 GLOBPARAXXX,其中 XXX任意正数