xmlstarlet - 如何使用 xmlstarlet 打印 XPath 匹配的位置?

标签 xmlstarlet

我想在 pom.xml 文件中找到对 SNAPSHOT 版本的引用。让我们使用位于 here 的 POM 文件举个例子。我想出了以下命令来查找包含字符串 SNAPSHOT 的元素:

$ xmlstarlet sel -t -m "//*[contains(text(), 'SNAPSHOT')]" -v . -n pom.xml
0.2-SNAPSHOT
4.12-SNAPSHOT
1.9.13-SNAPSHOT
20.0-SNAPSHOT

然而,正如上面所见,这只给我匹配本身的文本。我想看到的是关于匹配位置的更多上下文,例如通向匹配元素的路径,如下所示:

$ xmlstarlet magical arguments
/project/version: 0.2-SNAPSHOT
/project/dependencies/dependency: 4.12-SNAPSHOT
/project/properties/jackson.version: 1.9.13-SNAPSHOT
/project/properties/guava.version: 20.0-SNAPSHOT

或者,将 XML 的精简版本作为输出也对我有用,例如:

$ xmlstarlet magical arguments
<project>
  <version>0.2-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <version>4.12-SNAPSHOT</version>
    </dependency>
  </dependencies>
  <properties>
    <jackson.version>1.9.13-SNAPSHOT</jackson.version>
    <guava.version>20.0-SNAPSHOT</guava.version>
  </properties>
</project>

是否可以打印这些或其他类型的匹配发生位置的指示?

最佳答案

xmlstarlet 可以使用打破嵌套的 -b 选项生成请求的输出:

xmlstarlet sel -t \
    -m "//*[contains(text(),'SNAPSHOT')]" \
    -m 'ancestor::*' -v 'name()' -o '/' \
    -b -v "concat(name(),': ',.)" -n pom.xml

输出:

project/version: 0.2-SNAPSHOT
project/dependencies/dependency/version: 4.12-SNAPSHOT
project/properties/jackson.version: 1.9.13-SNAPSHOT
project/properties/guava.version: 20.0-SNAPSHOT

关于xmlstarlet - 如何使用 xmlstarlet 打印 XPath 匹配的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54097084/

相关文章:

xml - 用于更新部分 XML 元素值的 Bash 脚本

xml - 使用 xmlstarlet 或 xmllint 获取属性值

xml - 如何在多个文件上使用 xmlstarlet 并附加输出?

xml - 如何将 XML 命名空间与 xmlstarlet XPaths 一起使用?

xmlstarlet 选择并更新 xml

xml - 使用 xmlstarlet 连接多个 xml 元素

bash - 通过 XMLStarlet 取消转义符号 (&) - 窃听 &

shell - 使用 xmlstarlet 按 id 删除 SVG 中的节点

xmlstarlet递归地从多个文档中删除父元素

xml - 如何使用 xmlstarlet 搜索和编辑符合条件的 xml 标记