Existe-t-il un moyen simple de prendre la valeur d'une propriété, puis de la copier dans une autre propriété en remplaçant certains caractères?
Dites propA=This is a value
. Je veux remplacer tous les espaces qu'il contient par des traits de soulignement, ce qui entraîne propB=This_is_a_value
.
Utilisez la tâche propertyregex à partir de Ant Contrib .
Je pense que tu veux:
<propertyregex property="propB"
input="${propA}"
regexp=" "
replace="_"
global="true" />
Malheureusement, les exemples donnés ne sont pas très clairs, mais cela vaut la peine d'essayer. Vous devriez également vérifier ce qui se passe s'il n'y a pas de soulignement - vous devrez peut-être également utiliser l'option defaultValue
.
Voici la solution sans script et sans jarre externe comme ant-conrib:
L'astuce consiste à utiliser les ressources d'ANT:
<loadresource property="propB">
<propertyresource name="propA"/>
<filterchain>
<tokenfilter>
<filetokenizer/>
<replacestring from=" " to="_"/>
</tokenfilter>
</filterchain>
</loadresource>
Celui-ci remplacera tous les "" dans propA par "_" et placera le résultat dans propB. "filetokenizer" traite le flux d'entrée entier (notre propriété) comme un seul jeton et applique le remplacement de chaîne sur celui-ci.
Vous pouvez effectuer d'autres transformations de fantaisie à l'aide d'autres filtres de jeton: http://ant.Apache.org/manual/Types/filterchain.html
Si ant-contrib n'est pas une option, voici une solution portable pour Java 1.6 et versions ultérieures:
<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>
Si vous souhaitez utiliser une solution utilisant les intégrations Ant intégrées uniquement, tenez compte des éléments suivants:
<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} = "${propB}"" />
</target>
La sortie est ${propB} = "This_is_a_value"
Deux possibilités:
via une tâche de script et un moteur javascript intégré (si vous utilisez jdk> = 1.6)
<project>
<property name="propA" value="This is a value"/>
<script language="javascript">
project.setProperty('propB', project.getProperty('propA').
replace(" ", "_"));
</script>
<echo>$${propB} => ${propB}</echo>
</project>
ou en utilisant Ant addon Flaka
<project xmlns:fl="antlib:it.haefelinger.flaka">
<property name="propA" value="This is a value"/>
<fl:let> propB := replace('${propA}', '_', ' ')</fl:let>
<echo>$${propB} => ${propB}</echo>
</project>
pour remplacer la propriété existante propA simplement remplacer propB par propA
Utilisez une application externe comme sed:
<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot">
<arg value="s/_/./g"/>
</exec>
<echo>${wersjaDot}</echo>
Si vous utilisez Windows, obtenez-le sur Google pour "gnuwin32 sed".
La commande s/_/./g
remplace chaque _
par .
Ce script se passe bien sous windows. Sous linux arg peut avoir besoin de citer.
Voici une version plus générale de La réponse de Uwe Schindler :
Vous pouvez utiliser une macrodef
pour créer une tâche personnalisée.
<macrodef name="replaceproperty" taskname="@{taskname}">
<attribute name="src" />
<attribute name="dest" default="" />
<attribute name="replace" default="" />
<attribute name="with" default="" />
<sequential>
<loadresource property="@{dest}">
<propertyresource name="@{src}" />
<filterchain>
<tokenfilter>
<filetokenizer/>
<replacestring from="@{replace}" to="@{with}"/>
</tokenfilter>
</filterchain>
</loadresource>
</sequential>
</macrodef>
vous pouvez utiliser ceci comme suit:
<replaceproperty src="property1" dest="property2" replace=" " with="_"/>
ce sera très utile si vous le faites plusieurs fois
Ajout d'une réponse exemple plus complet sur un réponse précédente
<property name="propB_" value="${propA}"/>
<loadresource property="propB">
<propertyresource name="propB_" />
<filterchain>
<tokenfilter>
<replaceregex pattern="\." replace="/" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
Juste un FYI pour réponse Remplacement de caractères dans la propriété Ant - si vous essayez de l’utiliser dans une exécution maven, vous ne pouvez pas référencer directement les variables maven. Vous aurez besoin de quelque chose comme ça:
...
<target>
<property name="propATemp" value="${propA}"/>
<loadresource property="propB">
<propertyresource name="propATemp" />
...
Ou ... Vous pouvez aussi essayer Votre propre tâche
CODE Java:
class CustomString extends Task{
private String type, string, before, after, returnValue;
public void execute() {
if (getType().equals("replace")) {
replace(getString(), getBefore(), getAfter());
}
}
private void replace(String str, String a, String b){
String results = str.replace(a, b);
Project project = getProject();
project.setProperty(getReturnValue(), results);
}
..all getter and setter..
ANT SCRIPT
...
<project name="ant-test" default="build">
<target name="build" depends="compile, run"/>
<target name="clean">
<delete dir="build" />
</target>
<target name="compile" depends="clean">
<mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes" includeantruntime="true"/>
</target>
<target name="declare" depends="compile">
<taskdef name="string" classname="CustomString" classpath="build/classes" />
</target>
<!-- Replacing characters in Ant property -->
<target name="run" depends="declare">
<property name="propA" value="This is a value"/>
<echo message="propA=${propA}" />
<string type="replace" string="${propA}" before=" " after="_" returnvalue="propB"/>
<echo message="propB=${propB}" />
</target>
CONSOLE:
run:
[echo] propA=This is a value
[echo] propB=This_is_a_value