편집하다:

편집하다:

이 스크립트를 실행하고 있습니다.

INPUTNAME=ABC.XYZ
FILENAME="Sample.xml"

    awk -v inputName=$INPUTNAME '
      /<machine.*name=/ { f=1 ; m=0 ; res="" }
      f { res = res $0 ORS }
      f && /<details input="inputName"/ { m=1 }
      /<\/machine>/ { f=0 ; if (m) print res $0 }
     ' $FILENAME

다음과 같이 출력됩니다.

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

그런데 매개변수 입력에 실패했습니다. 스크립트에 어떤 문제가 있는 것 같나요?

노트:

하드코딩된 값(매개변수 없이)으로 실행했는데 원활하게 실행되었습니다.

답변1

awk가 변수를 해당 값으로 대체할지 확실하지 않습니다.

 f && /<details input="inputName"/ 

다음으로 교체하고 싶을 수도 있습니다.

 f && /<details input="/ && index($2,inputName) > 0

편집하다:

최종 awk 부분은 다음과 같아야 합니다.

    /<machine.*name=/ { f=1 ; m=0 ; res="" }
    f { res = res $0 ORS }
    f && /<details input="/ && index($2,inputName) > 0 { m=1 ;}
    /<\/machine>/ { f=0 ; if (m) print res  ;  } ## last line already in res

답변2

inputName변수이기 때문에 가능합니다.아니요Repexp 상수를 사용합니다 /.../( 에서와 같이 f && /<details input="inputName"/). 대신 문자열을 통해 동적 정규식을 사용하세요.

f && $0 ~ "<details input=" inputName

문자열을 변수와 "..."연결할 위치입니다 inputName.

(참고: XML을 처리하고 있으므로 XML 닫는 태그를 처리할 때 문자열의 모든 태그에는 \추가 수준의 이스케이프가 필요하다는 점을 기억하십시오.)

관련 정보