Existe-t-il un moyen simple de prendre la valeur d'une propriété et de la copier dans une autre propriété en remplaçant certains caractères?
Dis 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
.
defaultValue="${propA}"
est parfait en tant que recherche générale / remplacement d'une seule ligne: sinon, s'il n'y a pas de correspondance, rien n'est mis dans propB !! Merci!Voici la solution sans script et sans jars externes comme ant-conrib:
L'astuce consiste à utiliser les ressources d'ANT:
Celui-ci remplacera tous les "" de propA par "_" et placera le résultat dans propB. "filetokenizer" traite tout le flux d'entrée (notre propriété) comme un jeton et y ajoute le remplacement de chaîne.
Vous pouvez faire d'autres transformations sophistiquées en utilisant d'autres filtres de jetons: http://ant.apache.org/manual/Types/filterchain.html
la source
<filetokenizer/>
bit. Votre code fonctionne bien sans lui (au moins sur Ant v1.8.3).ant
et ne nécessite pas de bibliothèques supplémentaires.Si ant-contrib n'est pas une option, voici une solution portable pour Java 1.6 et versions ultérieures:
la source
replaceAll
fonction pour les chaînes. Utilisezbefore.replace( /\s/g, "_" )
plutôt.project.getProperty()
renvoie ajava.lang.String
, c'est doncreplaceAll()
approprié dans ce cas. Si vous souhaitez utiliserreplace()
, vous pouvez convertir «avant» en une chaîne JavaScript native avec:before = new String(before);
project.setNewProperty
serait plus portable, tout commesetProperty
pourrait remplacer l'ancienne valeur de propriété. Il pourrait même écrire à labefore
propriété.Si vous voulez une solution qui ne utilise Ant ENCASTRÉS seulement , considérez ceci:
La sortie est
${propB} = "This_is_a_value"
la source
Utilisez une application externe comme sed:
Si vous exécutez Windows, recherchez "gnuwin32 sed" sur Google.
La commande
s/_/./g
remplace tout_
par.
Ce script va bien sous windows. Sous Linux, arg peut avoir besoin de citations.la source
Deux possibilités:
via une tâche de script et un moteur javascript intégré (si vous utilisez jdk> = 1.6)
ou en utilisant l' addon Ant Flaka
pour écraser la propriété existante propA, remplacez simplement propB par propA
la source
Voici une version plus générale de la réponse d' Uwe Schindler :
Vous pouvez utiliser a
macrodef
pour créer une tâche personnalisée.vous pouvez l'utiliser comme suit:
cela sera très utile si vous faites cela plusieurs fois
la source
Ajout d'un exemple de réponse plus complet par rapport à une réponse précédente
la source
Juste un FYI pour réponse Remplacement des caractères dans la propriété Ant - si vous essayez d'utiliser cela dans une exécution maven, vous ne pouvez pas référencer directement les variables maven. Vous aurez besoin de quelque chose comme ceci:
la source
" "
de"_"
?propATemp
en remplaçant<propertyresource name="propATemp"/>
par<string value="${propA}"/>
Les propriétés ne peuvent pas être modifiées, mais les variables antContrib ( http://ant-contrib.sourceforge.net/tasks/tasks/variable_task.html ) le peuvent.
Voici une macro pour faire une recherche / remplacement sur un var:
Appelez ensuite la macro comme:
Le code ci-dessus utilise javascript split puis join, ce qui est plus rapide que regex. Les propriétés "locales" sont transmises à JavaScript donc aucune fuite de propriété.
la source
Ou ... vous pouvez également essayer votre propre tâche
CODE JAVA:
ANT SCRIPT
CONSOLE:
la source