如何将 Ant grep 更改为在其正则表达式中具有 unix 样式"or"?



我有下面的代码用于映射xml文件repo,在ant中:

<echo message="Now checking xml test results for errors"    />
        <exec executable="grep" error="/dev/null">
            <arg value="-r" />
            <arg value="-m" />
            <arg value="1" />
            <arg value="-rl" />
            <arg value="errors=&quot;[1-9]&quot;" /> 
            <arg value="${reports.dir}" />
        </exec>
    <fail if="junit.failed" message="FAILING - unit tests failed." />

我想替换:

   <arg value="errors=&quot;[1-9]&quot;" /> 

中加上如下内容:

   <arg value="errors|failures=&quot;[1-9]&quot;" /> 

这样错误和失败都将被捕获。如何在Ant XML中正确地编码grep以反映这一点?"**grep -r -m 1 -rl errors|failures="[1-9]" ../reports/**"没有做到这一点(它会导致语法问题,我猜会破坏标准的grep解析器)…

这是一个猜测,但您可以尝试以下内容:

<arg value="-e" />
<arg value="errors=&quot;[1-9]&quot;" />
<arg value="-e" />
<arg value="failures=&quot;[1-9]&quot;" />

源自man grep:

   -e PATTERN, --regexp=PATTERN
          Use PATTERN as the pattern; useful to protect patterns beginning with -.

您可以使用Ant过滤器链以与平台无关的方式完成此操作,而不是执行grep。

下面的示例为正则表达式过滤report.dir下的每个文件,当找到单个匹配时,头部过滤器会短路。结果输出被加载到一个属性中。

  <target name="test">
    <loadresource property="junit.failed">
      <concat>
        <fileset dir="${report.dir}">
          <include name="**/*"/>
        </fileset>
        <filterchain>
          <linecontainsregexp>
            <regexp pattern="failures|errors=&quot;d+&quot;"/>
           </linecontainsregexp>
           <headfilter lines="1"/>
        </filterchain>
      </concat>
    </loadresource>
    <fail if="junit.failed" message="FAILING - unit tests failed"/>
  </target>

使用此技术无法实现的一件事是获得匹配文件的名称(grep -l提供给您)而不是匹配行。但是,您没有在示例中使用文件名。

还请注意,您在grep中使用的正则表达式将不会发现大于9的错误和失败,例如errors="11"将无法找到。上面示例中的模式确实找到了这些

Pipe不适合您,因为它被shell解释为shell的管道而不是regex元素。为了改善这种情况,您应该将参数加引号。

grep -r -m 1 -rl "errors|failures="[1-9]"" ../reports/**"

相关内容

  • 没有找到相关文章

最新更新