Gibt es eine einfache Möglichkeit, den Wert einer Eigenschaft zu übernehmen und dann in eine andere Eigenschaft zu kopieren, wobei bestimmte Zeichen ersetzt werden?
Sagen Sie propA=This is a value
. Ich möchte alle darin enthaltenen Leerzeichen durch Unterstriche ersetzen, was zu propB=This_is_a_value
.
defaultValue="${propA}"
ist perfekt als allgemeine Suche / Ersetzung eines Einzeilers: Andernfalls wird nichts in propB eingefügt, wenn keine Übereinstimmung vorliegt !! Vielen Dank!Hier ist die Lösung ohne Scripting und ohne externe Gläser wie Ant-Conrib:
Der Trick besteht darin, die Ressourcen von ANT zu nutzen:
Dieser ersetzt alle "" in propA durch "_" und platziert das Ergebnis in propB. "filetokenizer" behandelt den gesamten Eingabestream (unser Eigentum) als ein Token und wendet den String-Ersatz darauf an.
Sie können andere ausgefallene Transformationen mit anderen Tokenfiltern durchführen: http://ant.apache.org/manual/Types/filterchain.html
quelle
<filetokenizer/>
Bit sogar fallen lassen können . Ihr Code funktioniert ohne ihn einwandfrei (zumindest unter Ant v1.8.3).ant
funktioniert und keine zusätzlichen Bibliotheken erfordert.Wenn Ant-Contrib keine Option ist, finden Sie hier eine tragbare Lösung für Java 1.6 und höher:
quelle
replaceAll
Funktion für Zeichenfolgen. Verwenden Siebefore.replace( /\s/g, "_" )
stattdessen.project.getProperty()
gibt a zurückjava.lang.String
,replaceAll()
ist also in diesem Fall angemessen. Wenn Sie verwendenreplace()
before = new String(before);
project.setNewProperty
wäre portabler, dasetProperty
alter Immobilienwert überschrieben werden könnte. Es könnte sogar auf dasbefore
Grundstück schreiben .Falls Sie eine Lösung , die Verwendung Ant Einbauten funktioniert nur , bedenken Sie:
Ausgabe ist
${propB} = "This_is_a_value"
quelle
Verwenden Sie eine externe App wie sed:
Wenn Sie Windows ausführen, googeln Sie nach "gnuwin32 sed".
Der Befehl
s/_/./g
ersetzt alle_
durch.
Dieses Skript funktioniert gut unter Windows. Unter Linux muss arg möglicherweise zitiert werden.quelle
Zwei Möglichkeiten:
über Skriptaufgabe und eingebaute Javascript-Engine (bei Verwendung von jdk> = 1.6)
oder mit Ant Addon Flaka
Um vorhandene Eigenschaften propA zu überschreiben, ersetzen Sie einfach propB durch propA
quelle
Hier ist eine allgemeinere Version von Uwe Schindlers Antwort :
Mit a können Sie
macrodef
eine benutzerdefinierte Aufgabe erstellen.Sie können dies wie folgt verwenden:
Dies ist sehr nützlich, wenn Sie dies mehrmals tun
quelle
Hinzufügen einer Antwort vollständigeres Beispiel gegenüber einer vorherigen Antwort
quelle
Nur ein FYI für die Antwort Ersetzen von Zeichen in der Ant-Eigenschaft - Wenn Sie versuchen, dies innerhalb einer Maven-Ausführung zu verwenden, können Sie nicht direkt auf Maven-Variablen verweisen. Sie benötigen so etwas:
quelle
" "
zu"_"
?propATemp
durch Ersetzen<propertyresource name="propATemp"/>
mit<string value="${propA}"/>
Eigenschaften können nicht geändert werden, aber antContrib-Variablen ( http://ant-contrib.sourceforge.net/tasks/tasks/variable_task.html) ) jedoch.
Hier ist ein Makro zum Suchen / Ersetzen einer Variable:
Rufen Sie dann das Makro wie folgt auf:
Der obige Code verwendet Javascript Split und Join, was schneller als Regex ist. "lokale" Eigenschaften werden an JavaScript übergeben, sodass keine Eigenschaften verloren gehen.
quelle
Oder ... Sie können es auch versuchen Ihre eigene Aufgabe
JAVA CODE:
ANT SCRIPT
KONSOLE:
quelle