用于处理文本文件的正则表达式 - Windows

时间:2012-12-07 17:21:29

标签: regex string nant

我在处理文本文件以获得所需结果时遇到问题。

例如,我在一个名为sprocs.txt的文本文件中有以下行,它是从svn diff创建的,类似于:

     M      https://localhost/svn/Repo/branches/projectA/sprocs/admin/foo.sql
     M      https://localhost/svn/Repo/branches/projectA/sprocs/foo2.sql
     M      https://localhost/svn/Repo/branches/projectA/sprocs/admin
     M      https://localhost/svn/Repo/branches/projectA/sprocs

我正在尝试编辑此文件,以便保留以/sprocs开头的所有内容,但删除不以.sql结尾的每一行。例如,上面的文件将返回以下内容:

    /sprocs/admin/foo.sql 
    /sprocs/foo2.sql

顺便说一句:我打算让这些命令由nant处理。任何人的想法?提前谢谢。

3 个答案:

答案 0 :(得分:3)

这可以使用纯NAnt来完成工作:

<target name="go">
  <property
    name="file.path"
    value="C:\foo\sprocs.txt" />
  <foreach
    item="Line"
    in="${file.path}"
    property="line">
    <property
      name="MATCH"
      value="" />
    <regex
      pattern="(?'MATCH'/sprocs.*\.sql)$"
      input="${line}"
      failonerror="false" />
    <if test="${string::get-length(MATCH) > 0}">
      <echo message="match: ${MATCH}" />
      <!-- do whatever you want to do with your match -->
    </if>
  </foreach>
</target>

不如palako's solution那么优雅,但它也有效。

答案 1 :(得分:2)

 $ cat sprocs.txt | sed -n 's/.*\(\/sprocs\/.*\.sql$\)/\1/p'
/sprocs/admin/foo.sql
/sprocs/foo2.sql

答案 2 :(得分:1)

以下正则表达式模式应该适合您,它将创建一个捕获组,该组将找到以/sprocs开头并以.sql结尾的任何内容

(/sprocs.*\.sql$)

请确保通过将其传递给nant正则表达式的选项来启用多线模式,否则将无法正确匹配。我认为这是 m 选项,如here

所述