이 스크립트를 실행하고 있습니다.
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 닫는 태그를 처리할 때 문자열의 모든 태그에는 \
추가 수준의 이스케이프가 필요하다는 점을 기억하십시오.)