2016-08-01 37 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>