Czy istnieje prosty sposób na pobranie wartości właściwości, a następnie skopiowanie jej do innej właściwości z zastąpieniem pewnych znaków?
Powiedz propA=This is a value
. Chcę zamienić wszystkie spacje na podkreślenia, w wyniku czego propB=This_is_a_value
.
defaultValue="${propA}"
jest idealne jako ogólne wyszukiwanie / zamiana jednowierszowa: w przeciwnym razie, jeśli nie ma dopasowania, nic nie jest umieszczane w propB !! Dzięki!Oto rozwiązanie bez skryptów i bez zewnętrznych plików jar, takich jak ant-conrib:
Sztuczka polega na wykorzystaniu zasobów ANT:
<loadresource property="propB"> <propertyresource name="propA"/> <filterchain> <tokenfilter> <filetokenizer/> <replacestring from=" " to="_"/> </tokenfilter> </filterchain> </loadresource>
Ten zamieni wszystkie „” w propA na „_” i umieści wynik w propB. „filetokenizer” traktuje cały strumień wejściowy (naszą właściwość) jako jeden token i umieszcza na nim zastąpienie ciągu.
Możesz wykonać inne wymyślne transformacje za pomocą innych filtrów tokenów: http://ant.apache.org/manual/Types/filterchain.html
źródło
<filetokenizer/>
bit. Twój kod działa bez niego (przynajmniej na Ant v1.8.3).ant
i nie wymaga dodatkowych bibliotek.Jeśli ant-contrib nie jest opcją, oto przenośne rozwiązanie dla Java 1.6 i nowszych:
<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>
źródło
replaceAll
funkcji dla ciągów. Użyjbefore.replace( /\s/g, "_" )
zamiast tego.project.getProperty()
zwraca ajava.lang.String
, więcreplaceAll()
jest to odpowiednie w tym przypadku. Jeśli chcesz użyćreplace()
, możesz przekonwertować „przed” na natywny ciąg JavaScript za pomocą:before = new String(before);
project.setNewProperty
byłoby bardziej przenośne, ponieważsetProperty
mogłoby nadpisać starą wartość właściwości. Mógłby nawet napisać dobefore
nieruchomości.W przypadku, gdy chcesz rozwiązanie, które używa Ant Zabudowy tylko , rozważ to:
<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>
Wyjście jest
${propB} = "This_is_a_value"
źródło
Użyj zewnętrznej aplikacji, takiej jak sed:
<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot"> <arg value="s/_/./g"/> </exec> <echo>${wersjaDot}</echo>
Jeśli używasz systemu Windows, zacznij googlować w poszukiwaniu „gnuwin32 sed”.
Komenda
s/_/./g
zastępuje każdy_
z.
tego skryptu idzie dobrze pod oknami. Pod linux arg może wymagać cytowania.źródło
Dwie możliwości:
poprzez zadanie skryptu i wbudowany silnik javascript (jeśli używasz 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>
lub używając dodatku Ant 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>
aby nadpisać istniejącą właściwość propA, po prostu zamień propB na propA
źródło
Oto bardziej uogólniona wersja odpowiedzi Uwe Schindlera :
Możesz użyć
macrodef
do utworzenia zadania niestandardowego.<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>
możesz tego użyć w następujący sposób:
<replaceproperty src="property1" dest="property2" replace=" " with="_"/>
będzie to bardzo przydatne, jeśli robisz to wiele razy
źródło
Dodanie odpowiedzi bardziej kompletnego przykładu w stosunku do poprzedniej odpowiedzi
<property name="propB_" value="${propA}"/> <loadresource property="propB"> <propertyresource name="propB_" /> <filterchain> <tokenfilter> <replaceregex pattern="\." replace="/" flags="g"/> </tokenfilter> </filterchain> </loadresource>
źródło
Tylko FYI do odpowiedzi. Zastępowanie znaków we właściwości Ant - jeśli próbujesz użyć tego wewnątrz wykonania mavena, nie możesz bezpośrednio odwoływać się do zmiennych maven. Będziesz potrzebował czegoś takiego:
... <target> <property name="propATemp" value="${propA}"/> <loadresource property="propB"> <propertyresource name="propATemp" /> ...
źródło
" "
do"_"
?propATemp
poprzez zastąpienie<propertyresource name="propATemp"/>
z<string value="${propA}"/>
Właściwości nie można zmienić, ale zmienne antContrib ( http://ant-contrib.sourceforge.net/tasks/tasks/variable_task.html ) mogą.
Oto makro do znalezienia / zamiany na zmiennej:
<macrodef name="replaceVarText"> <attribute name="varName" /> <attribute name="from" /> <attribute name="to" /> <sequential> <local name="replacedText"/> <local name="textToReplace"/> <local name="fromProp"/> <local name="toProp"/> <property name="textToReplace" value = "${@{varName}}"/> <property name="fromProp" value = "@{from}"/> <property name="toProp" value = "@{to}"/> <script language="javascript"> project.setProperty("replacedText",project.getProperty("textToReplace").split(project.getProperty("fromProp")).join(project.getProperty("toProp"))); </script> <ac:var name="@{varName}" value = "${replacedText}"/> </sequential> </macrodef>
Następnie wywołaj makro na przykład:
<ac:var name="updatedText" value="${oldText}"/> <current:replaceVarText varName="updatedText" from="." to="_" /> <echo message="Updated Text will be ${updatedText}"/>
Powyższy kod używa podziału javascript, a następnie złączenia, co jest szybsze niż regex. Właściwości „lokalne” są przekazywane do JavaScript, więc nie ma wycieku właściwości.
źródło
Lub ... Możesz także spróbować własnego zadania
KOD JAVA:
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>
KONSOLA:
źródło