88 votes

Remplacer des caractères dans la propriété Ant

Est-il un moyen simple de prendre la valeur d'une propriété, puis les copier sur une autre propriété avec certains caractères remplacé?

Dire propA=This is a value. Je veux remplacer tous les espaces en " souligne, résultant en propB=This_is_a_value.

102voto

Uwe Schindler Points 401

Voici la solution sans script et pas extérieure des pots comme ant-conrib:

L'astuce est d'utiliser de la FOURMI ressources:

  • Il y a un type de ressource appelée "propertyresource" qui est comme un fichier source, mais fournit un flux à partir de la chaîne de valeur de cette ressource. De sorte que vous pouvez le charger et l'utiliser dans n'importe quelle tâche comme "copie" qui accepte les fichiers
  • Il y a aussi la tâche "loadresource" qui peut charger n'importe quelle ressource à une propriété (par exemple, un fichier), mais celui-ci pourrait également charger notre propertyresource. Cette tâche permet de filtrer l'entrée par l'application d'un jeton de transformations. Enfin la suite de faire ce que vous souhaitez:
<loadresource property="propB">
  <propertyresource name="propA"/>
  <filterchain>
    <tokenfilter>
      <filetokenizer/>
      <replacestring from=" " to="_"/>
    </tokenfilter>
  </filterchain>
</loadresource>

Celui-ci va remplacer tous les "" dans propA par "_" et place le résultat dans propB. "filetokenizer" traite l'intégralité du flux d'entrée (notre propriété) comme un jeton et entrées grasses la chaîne de remplacement.

Vous pouvez faire d'autres fantaisie de transformations à l'aide d'autres tokenfilters: http://ant.apache.org/manual/Types/filterchain.html

88voto

Jon Skeet Points 692016

Utiliser le propertyregex tâche Ant Contrib.

Je pense que vous voulez:

<propertyregex property="propB"
               input="${propA}"
               regexp=" "
               replace="_"
               global="true" />

Malheureusement, les exemples donnés ne sont pas très claires, mais il vaut la peine d'essayer. Vous devriez également vérifier ce qui se passe si il n'y a pas souligne - vous pouvez avoir besoin d'utiliser l' defaultValue option.

56voto

dnault Points 1248

Si ant-contrib n'est pas une option, voici une solution portable pour Java 1.6 et plus tard:

<property name="before" value="This is a value"/>
<script language="javascript">
    var before = project.getProperty("before");
    project.setProperty("after", before.replaceAll(" ", "_"));
</script>
<echo>after=${after}</echo>

26voto

mgaert Points 963

Dans le cas où vous voulez une solution qui répond à utiliser Ant built-ins seulement, considérez ceci:

<target name="replace-spaces">
    <property name="propA" value="This is a value" />
    <echo message="${propA}" file="some.tmp.file" />
    <loadfile property="propB" srcFile="some.tmp.file">
        <filterchain>
            <tokenfilter>
                <replaceregex pattern=" " replace="_" flags="g"/>
            </tokenfilter>
        </filterchain>
    </loadfile>
    <echo message="$${propB} = &quot;${propB}&quot;" />
</target>

La sortie est - ${propB} = "This_is_a_value"

8voto

Jarekczek Points 2297

L'utilisation de certaines app externe comme sed:

<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot">
  <arg value="s/_/./g"/>
</exec>
<echo>${wersjaDot}</echo>

Si vous exécutez Windows obtenir googler "gnuwin32 sed".

La commande s/_/./g remplace chaque _ avec . Ce script va bien sous windows. Sous linux arg peut-être besoin de le citer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X