다음과 같은 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
입력 매개변수가 세부정보 대기열(@block 중간)인 경우 동일한 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
. 예를 들어, <details queue="ABC.SAMPLE"
여는 XML 태그와 닫는 XML 태그 사이에서 검색됩니다.<machine>
답변2
명령줄에서 사용 xmlstarlet
하고 값을 인수로 제공합니다.queue
xmlstarlet sel -t --var queue="'ABC.SAMPLE'" -c \
'//machine[details[@queue = $queue]]' -nl file.xml
그러면 하위 항목과 속성 값이 machine
있는 모든 노드의 복사본이 반환됩니다 .details
query
ABC.SAMPLE