当输入参数位于块的中间时,如何在获取 xml 块时实现 awk 范围模式

当输入参数位于块的中间时,如何在获取 xml 块时实现 awk 范围模式

我正在尝试获取这样的 xml 块:

<machine name="sample1" min="1" max="10" idleTime="300" backend="ABC,XYZ">
                <handler className="com.abc.xyz.qwerty.foo.FooBar" />
                <details queue="ABC.SAMPLE" suggExpiry="30" minExpiry="4" maxExpiry="500"/>
                </machine>

详细信息队列将作为输入参数。

当机器名称(@块的开头)是我的参数时,我成功了

awk '/<machine.*name="sample1"/,/<\/machine>/' Target.xml

当输入参数是详细信息队列(@块的中间)时,我如何获取相同的 xml 块?

答案1

以下是对此问题的一种看法awk

awk '
  /<machine.*name=/ { f=1 ; m=0 ; res="" }
  f { res = res $0 ORS }
  f && /PATTERN/ { m=1 }
  /<\/machine>/ { f=0 ; if (m) print res $0 }
' your_XML_file

它正在实施 FSA。标志f控制您是否在所需的 XML 块中,标志m表明您的项目是否已在该块中找到,并res用于记住该块,如果条件匹配,将在块的末尾打印。

请注意,您必须替换PATTERN为您正在寻找的实际模式 - 在您的示例中它是,例如- 将在开始和结束XML 标记<details queue="ABC.SAMPLE"之间搜索。<machine>

答案2

在命令行上使用xmlstarlet并提供该值作为参数:queue

xmlstarlet sel -t --var queue="'ABC.SAMPLE'"  -c \
    '//machine[details[@queue = $queue]]' -nl file.xml

这将返回每个machine具有details子节点且query属性值为 的节点的副本ABC.SAMPLE

相关内容