2016-08-01 41 views
0

我正在使用Ant ReplaceRegExp任务来替换超过10,000个文件中的文本。每个文件都有多个我需要执行的搜索/替换模式。截至目前,有多个块,每个块的文件集都是“**/*。java”。Ant ReplaceRegExp任务 - 每个文件有多个替换?

当我搜索/替换的东西列表增长时,这需要永远运行,因为它将在10k文件上执行ReplaceRegExp#1,然后在10k文件上执行ReplaceRegExp2,等等。我已经有大约15个ReplaceRegExp块,所以我的任务已经花了大约45分钟。

有没有办法获得它,所以每个文件只能处理/访问一次,它执行所有15+我的正则表达式搜索/替换的文件,而不是文件必须处理15+个别时间?

在本质上,寻找的东西,在逻辑上是这样的:

<replaceregexp 
     match="firstmatch" 
     replace="firstraplce" 

     match="secondmatch" 
     replace="secondreplace" 

     etc.. 

     byline="true"> 
     <fileset dir="."> 
      <include name="**/*.java"/> 
     </fileset> 
    </replaceregexp> 

这显然无效的XML,但是从概念上显示了我要找的。现在我使用2组 - 一组用于“firstmatch/firstreplace”和一组用于“secondmatch/secondreplace”的文件。

谢谢。

回答

0

您可以使用TokenFilterFilterChain and FilterReader,它允许定义一个标记器(在你的情况下是一个线标记器)和一组将按顺序应用的过滤器。不知道是否有比调用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> 
+0

这将返回一个错误:** tokenfilter不支持嵌套的“replaceregexp”元素** – Heinz

+0

@ Heinz感谢您指出这个错误,这是一个错字...我纠正了这个例子,现在它可以工作... –

0

以下工作:

<filterchain> 
    <tokenfilter> 
     <replacestring from="oldstr1" to="newstr1"/> 
     <replacestring from="oldstr2" to="newstr2"/> 
    </tokenfilter> 
</filterchain>