2009-04-22 67 views
17

我有一個文件目錄,我想使用Apache Ant(Linux上的版本1.7.1)進行「就地」字符串過濾。用Ant過濾文件?

例如,假設在目錄mydir中,我有文件foobarbaz。進一步假設正則表達式OLD([0-9])的所有出現應該改變爲NEW\1,例如, OLD2NEW2。 (請注意,replace Ant任務將無法工作,因爲它不支持正則表達式過濾。)

這個測試的情況可以用下面的命令猛砸創建(螞蟻會在當前目錄下運行,即mydir的父目錄):

mkdir mydir 
for FILE in foo bar baz ; do echo "A OLD1 B OLD2 C OLD3" > mydir/${FILE} ; done 

這是我第一次嘗試做過濾用Ant:

<?xml version="1.0"?> 
<project name="filter" default="filter"> 
    <target name="filter"> 
     <move todir="mydir"> 
      <fileset dir="mydir"/> 
      <filterchain> 
       <tokenfilter> 
        <replaceregex pattern="OLD([0-9])" replace="NEW\1" flags="g"/> 
       </tokenfilter> 
      </filterchain> 
     </move> 
    </target> 
</project> 

運行此第一Ant腳本在mydir上的文件沒有任何影響。默認情況下overwrite參數爲true,並且使用move Ant任務。我甚至撥弄granularity設置,但這並沒有幫助。

這是我的第二次嘗試,它「有效」,但由於臨時文件創建而有點煩人。該版本由內容到文件與filtered後綴移動正確過濾內容,然後經過過濾的內容爲「遷回」與原文件名:

<?xml version="1.0"?> 
<project name="filter" default="filter"> 
    <target name="filter"> 
     <move todir="mydir"> 
      <globmapper from="*" to="*.filtered"/> 
      <fileset dir="mydir"/> 
      <filterchain> 
       <tokenfilter> 
        <replaceregex pattern="OLD([0-9])" replace="NEW\1" flags="g"/> 
       </tokenfilter> 
      </filterchain> 
     </move> 
     <move todir="mydir"> 
      <globmapper from="*.filtered" to="*"/> 
      <fileset dir="mydir"/> 
     </move> 
    </target> 
</project> 

能在第一次嘗試(不包括臨時文件)是由工作?

+1

+1,寫得很好的問題 – 2009-04-22 21:20:48

回答

15

replace任務:

<replace 
    dir="mydir" 
    includes="foo, bar, baz"> 
    <replacefilter token="OLD" value="NEW" /> 
</replace> 

replaceregexp任務:

<replaceregexp 
    file="${src}/build.properties" 
    match="OldProperty=(.*)" 
    replace="NewProperty=\1" 
    byline="true"/> 
+0

謝謝,但事實證明,我的問題是不完整的。當我寫這個問題時,我「太簡化」了我的生產代碼。我忽略了指定正則表達式篩選的需要,替換似乎不支持(如果我錯了,請糾正我)。無需定期表達,您已經爲案例提供了很好的答案。 – 2009-04-22 20:58:08