0

我在处理文本文件以获得我想要的结果时遇到问题。

例如,我在一个名为的文本文件中有以下行,该文件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 处理这些命令。有什么想法吗?提前致谢。

4

3 回答 3

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>

不像帕拉科的解决方案那样优雅,但它也有效。

于 2012-12-08T11:42:49.633 回答
2
 $ cat sprocs.txt | sed -n 's/.*\(\/sprocs\/.*\.sql$\)/\1/p'
/sprocs/admin/foo.sql
/sprocs/foo2.sql
于 2012-12-08T02:47:48.013 回答
1

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

(/sprocs.*\.sql$)

确保通过在 nant 正则表达式的选项中传递多行模式来启用多行模式,否则将无法正确匹配。我相信这是m选项,如此处所述

于 2012-12-07T17:40:09.560 回答