我正在尝试获取这样的 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
。