我正在运行这个脚本:
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 结束标记时,在字符串中,任何标记\
都需要额外的转义级别。)