我正在使用Ant ReplaceRegExp任务来替换10000多个文件中的文本。每个文件都有我需要执行的多个搜索/替换模式。截至目前,有多个块,每个块的FileSet为"**/*.java".
随着我要搜索/替换的内容列表的增加,这需要很长时间才能运行,因为它将对10k文件执行ReplaceRegExp#1,然后对10k个文件执行ReplaceRegExp2,依此类推。我已经有大约15个ReplaceRegExp块,所以我的任务已经花了大约45分钟。
有没有一种方法可以让每个文件只处理/访问一次,并且它对文件执行所有15次以上的regex搜索/替换,而不是文件必须单独处理15次以上?
从本质上讲,寻找逻辑上像这样的东西:
<replaceregexp
match="firstmatch"
replace="firstraplce"
match="secondmatch"
replace="secondreplace"
etc..
byline="true">
<fileset dir=".">
<include name="**/*.java"/>
</fileset>
</replaceregexp>
这显然是无效的XML,但从概念上显示了我要查找的内容。现在,我在同一组文件中使用了两个组,一个用于"firstmatch/firstreplace",另一组用于"secondmatch/scondreplace"。
谢谢。
以下作品:
<filterchain>
<tokenfilter>
<replacestring from="oldstr1" to="newstr1"/>
<replacestring from="oldstr2" to="newstr2"/>
</tokenfilter>
</filterchain>
您可以使用FilterChain和FilterReader中的TokenFilter,它允许定义一个标记器(在您的情况下是一个行标记器)和一组将按顺序应用的过滤器。不知道它是否比调用n次ReplaceRegExp任务有更好的性能,但你应该试试:
<filterchain>
<tokenfilter>
<replaceregex pattern="match_1" replace="replace_1"/>
<replaceregex pattern="match_2" replace="replace_2"/>
...
<replaceregex pattern="match_n" replace="replace_n"/>
</tokenfilter>
</filterchain>