我在处理文本文件以获得所需结果时遇到问题。
例如,我在一个名为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处理。任何人的想法?提前谢谢。
答案 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
所述