2009-04-22 27 views
17

Ich habe ein Verzeichnis von Dateien, für die ich "In-Place" String-Filterung mit Apache Ant (Version 1.7.1 unter Linux) machen möchte.Filtern von Dateien mit Ant?

Angenommen, dass im Verzeichnis mydir Ich habe Dateien foo, bar und baz. Angenommen, alle Vorkommen des regulären Ausdrucks OLD([0-9]) sollten in NEW\1 geändert werden, z. OLD2NEW2. (Beachten Sie, dass die replace Ant-Task wird nicht funktionieren, weil es nicht für reguläre Ausdrücke Filterung unterstützt.)

Diese Testsituation kann mit den folgenden Bash-Befehle erstellt werden (ant wird im aktuellen Verzeichnis ausgeführt werden, das heißt mydir ‚s übergeordnetes Verzeichnis):

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

Hier ist mein erster Versuch, die Filterung mit Ant zu tun:

<?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> 

diesen ersten Ant-Skript läuft, hat keine Auswirkungen auf den Dateien in mydir. Der Parameter overwrite ist standardmäßig true mit der Ant-Task move. Ich habe sogar mit der granularity Einstellung getüftelt, aber das hat nicht geholfen.

Hier ist mein zweiter Versuch, der "funktioniert", aber etwas nervig wegen der temporären Dateierstellung ist. Diese Version filtert den Inhalt richtig durch den Inhalt von Dateien mit einem filtered Suffix bewegt, dann der gefilterte Inhalt wird „zurückgefahren“ mit Original-Dateinamen:

<?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> 

Kann der erste Versuch (ohne temporäre Dateien) vorgenommen werden Arbeit?

+1

+1, gut geschriebene Frage –

Antwort

15

Siehe replace Aufgabe:

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

oder die replaceregexp Aufgabe:

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

Danke, aber es stellt sich heraus, dass meine Frage nicht vollständig ist. Ich habe meinen Produktionscode zu sehr "vereinfacht", als ich diese Frage schrieb. Ich habe es versäumt, die Notwendigkeit einer Filterung für reguläre Ausdrücke anzugeben, die anscheinend nicht unterstützt wird (bitte korrigiere mich, wenn ich falsch liege!). Sie haben eine gute Antwort für den Fall gegeben, ohne regelmäßige Expressionen zu benötigen. –

+2

In diesem Fall, siehe die optionale replace_rexp Task: http://ant.apache.org/manual/OptionalTasks/replaceregexp.html – Kevin

+1

Die optionalen Aufgaben! Genius! Ich habe wahrscheinlich zweimal in meinem Leben die Aufgaben der Ant gesehen. Total vergessen, dass sie da waren. Vielen Dank! Fügen Sie eine neue Antwort mit der Task replace_rexp hinzu, oder bearbeiten Sie diese Antwort, und ich akzeptiere sie. Hier mache ich es Ihnen leicht (beachten Sie die Flags = "g", um alle Vorkommen zu erfassen):

Verwandte Themen