입력 매개변수가 블록 중간에 있을 때 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

입력 매개변수가 세부정보 대기열(@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있는 모든 노드의 복사본이 반환됩니다 .detailsqueryABC.SAMPLE

관련 정보