编辑:

编辑:

我正在运行这个脚本:

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 结束标记时,在字符串中,任何标记\都需要额外的转义级别。)

相关内容