2009-04-22 7 views
17

J'ai un répertoire de fichiers pour lesquels j'aimerais faire un filtrage de chaînes «sur place» en utilisant Apache Ant (version 1.7.1 sous Linux).Filtrer les fichiers en place avec la fourmi?

Par exemple, supposons que dans le répertoire mydir j'ai des fichiers foo, bar et baz. Supposons en outre que toutes les occurrences de l'expression régulière OLD([0-9]) doivent être remplacées par NEW\1, par ex. OLD2NEW2. (Notez que la replace tâche Ant ne fonctionnera pas, car il ne supporte pas le filtrage d'expression régulière.)

Cette situation de test peut être créé avec les commandes Bash suivantes (ant sera exécuté dans le répertoire courant, soit mydir « s répertoire parent):

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

Voici ma première tentative de faire le filtrage avec 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> 

l'exécution de ce premier script Ant n'a pas d'effet sur les fichiers mydir. Le paramètre overwrite est true par défaut avec la tâche Ant move. J'ai même joué avec le réglage granularity, mais cela n'a pas aidé.

Voici ma deuxième tentative, qui "fonctionne", mais qui est légèrement gênante à cause de la création de fichiers temporaires. Cette version filtre le contenu correctement en déplaçant le contenu des fichiers avec un suffixe filtered, le contenu filtré est « déplacé en arrière » avec des noms originaux:

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

la première tentative peut (sans fichiers temporaires) soient présentés travail?

+1

+1, question bien écrit –

Répondre

15

Voir la replace tâche:

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

ou replaceregexp tâche:

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

Merci, mais il se trouve que ma question est incomplète. J'ai "simplifié" trop mon code de production quand j'ai écrit cette question. J'ai négligé de spécifier le besoin d'un filtrage d'expression régulière, lequel ne semble pas supporter (merci de me corriger si je me trompe!). Vous avez donné une excellente réponse pour l'affaire sans avoir besoin d'expressions régulières. –

+2

Dans ce cas, voir la tâche facultative de replaceregexp: http://ant.apache.org/manual/OptionalTasks/replaceregexp.html – Kevin

+1

Les tâches facultatives! Génie! J'ai probablement regardé les tâches optionnelles Ant deux fois dans ma vie. Totalement oublié qu'ils étaient là. Merci! Veuillez ajouter une nouvelle réponse en utilisant la tâche remplaceregexp ou modifiez cette réponse et je l'accepterai. Ici, je vais le rendre facile pour vous (notez les drapeaux = "g" pour attraper toutes les occurrences):

Questions connexes