Как я могу изменить Ant grep, чтобы иметь стиль "Unix" или "в его регулярном выражении? - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть следующий код для поиска в репозитории XML-файлов в 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;" /> 

Так что и ошибки, и сбои будут обнаружены.Как я могу правильно кодировать grep в моем Ant XML, чтобы отразить это?"**grep -r -m 1 -rl errors|failures=\"[1-9]\" ../reports/**" не справляется (это приводит к синтаксической проблеме, нарушающей стандартный синтаксический анализатор grep, я думаю) ...

Ответы [ 3 ]

4 голосов
/ 24 ноября 2011

Это предположение, но вы можете попробовать что-то вроде:

<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 -.
3 голосов
/ 24 ноября 2011

Вы можете сделать это независимо от платформы, используя Ant filterchain вместо выполнения 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" не будет найдено. Шаблон в примере выше находит это.

1 голос
/ 24 ноября 2011

Труба не работает для вас, потому что она интерпретируется оболочкой как труба оболочки вместо элемента регулярного выражения.Чтобы улучшить ситуацию, вы должны поместить параметр в кавычки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...