2010-11-05 23 views
1

Je souhaite créer une cible de fourmis pouvant remplacer le contenu d'un fichier (ou plus) qui ne commence pas par un motif défini. Existe-t-il une solution pour cela en utilisant ant et replaceregexp? Ou une alternative à cela? Exemple:Ant pour remplacer le texte de fichier qui ne commence pas par

  • Je fichier boo.txt qui a le texte: "c'est boo". J'ai aussi le fichier foo.txt qui a le texte: "juste foo".

Je souhaite modifier le texte du foo.txt à: « ce juste foo »

Répondre

7

probablement un cas de cuisson une expression régulière appropriée avec des captures.

Celui-ci semble fonctionner pour l'exemple que vous donnez.

<property name="prefix" value="this " /> 
<replaceregexp flags="s" match="^(${prefix})?(.*)" replace="${prefix}\2"> 
    <fileset dir="files" /> 
</replaceregexp> 
  • Les fichiers sont spécifiés à l'aide d'un ensemble de fichiers - ici tous les fichiers du répertoire files.
  • Le préfixe que nous voulons éventuellement ajouter est this, qui est stocké dans une propriété, car nous devons le mentionner à deux endroits.
  • Le paramètre flags="s" garantit que nous traitons le fichier comme une seule chaîne à des fins de correspondance (plutôt que de correspondance à chaque ligne).
  • L'expression régulière recherche la chaîne de préfixe dans le fichier et la stocke dans la capture \1 - qui est ignorée.
  • Le reste de la chaîne est en capture \2.
  • Remplacez par la chaîne de préfixe, suivie de la capture \2.

Vous pourriez penser comme toujours ajouter le préfixe, mais après avoir pris le préfixe loin si elle est déjà là ... sauf que la tâche ne replaceregexppas écrire le fichier, sauf si diffère de l'existant .

+0

Wow, solution très élégante, merci! J'ai trouvé quelque chose de similaire en regardant autour et regarder en avant, mais c'est plus simple! – Robert

+0

Avez-vous une idée pour échapper des caractères spéciaux regex dans la valeur de la propriété prefix? – Robert

0

c'est juste une réponse partielle .. Je ne sais pas si son correct, mais au moins peut-être vous donner une direction

pour ce dont vous avez besoin ant-contrib

<property name="folder.name" value="some-folder-name" /> 
    <property name="text.substitution" value="this " /> 

    <target name="main"> 
     <foreach target="target2" param="file_path"> 
      <path> 
      <fileset dir="${folder.name}" casesensitive="no" /> 
      </path> 
     </foreach> 
    </target> 

<target name="target2"> 
    <loadfile property="message" srcFile="${file_path}"/> 
     <!-- f message doesnt have text.substitution at the begging --> 
     <!-- not sure if this is correct regex --> 
     <propertyregex property="myprop" input="${message}" 
         regexp="([^b]+)" select="\0" casesensitive="false" /> 
    <if> 
     <equals arg1="${myprop}" arg2="{text.substitution}" />  
    <then> 
     <concat destfile="foo.txt" append="true">${text.substitution} </concat> 
    </then> 
    </if> 
</target>