Есть ли простой способ взять значение свойства, а затем скопировать его в другое свойство с заменой определенных символов?
Скажи propA=This is a value
. Я хочу заменить все пробелы в нем на подчеркивания, в результате чего получится propB=This_is_a_value
.
defaultValue="${propA}"
идеально подходит для обычного поиска / замены однострочника: в противном случае, если совпадений нет, в propB ничего не помещается !! Благодарность!Вот решение без сценариев и внешних банок, таких как ant-conrib:
Уловка состоит в том, чтобы использовать ресурсы ANT:
<loadresource property="propB"> <propertyresource name="propA"/> <filterchain> <tokenfilter> <filetokenizer/> <replacestring from=" " to="_"/> </tokenfilter> </filterchain> </loadresource>
Он заменит все "" в propA на "_" и поместит результат в propB. "filetokenizer" рассматривает весь входной поток (наше свойство) как один токен и применяет к нему замену строки.
Вы можете выполнять другие причудливые преобразования, используя другие фильтры токенов: http://ant.apache.org/manual/Types/filterchain.html
источник
<filetokenizer/>
бит можно даже уронить . Ваш код отлично работает без него (по крайней мере, на Ant v1.8.3).ant
и не требует дополнительных библиотек.Если ant-contrib не подходит, вот переносимое решение для Java 1.6 и новее:
<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>
источник
replaceAll
функции для строк.before.replace( /\s/g, "_" )
Вместо этого используйте .project.getProperty()
возвращает ajava.lang.String
, поэтомуreplaceAll()
в этом случае подходит. Если вы хотите использоватьreplace()
, вы можете преобразовать «до» в собственную строку JavaScript с помощью:before = new String(before);
project.setNewProperty
будет более портативным, так какsetProperty
может перезаписать старое значение свойства. Он мог даже написать вbefore
собственность.В случае , если вы хотите , решение , которое делает использование Ant встроенные модули только , считают это:
<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>
Выход
${propB} = "This_is_a_value"
источник
Используйте какое-нибудь внешнее приложение, например sed:
<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot"> <arg value="s/_/./g"/> </exec> <echo>${wersjaDot}</echo>
Если вы запустите Windows, поищите в Google "gnuwin32 sed".
Команда
s/_/./g
заменяет каждый_
на.
Этот сценарий хорошо работает под окнами. В linux arg может потребоваться цитирование.источник
Две возможности:
через задачу скрипта и встроенный движок javascript (при использовании 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>
или используя 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>
чтобы перезаписать существующее свойство propA, просто замените propB на propA
источник
Вот более обобщенная версия ответа Уве Шиндлера :
Вы можете использовать
macrodef
для создания настраиваемой задачи.<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>
вы можете использовать это следующим образом:
<replaceproperty src="property1" dest="property2" replace=" " with="_"/>
это будет очень полезно, если вы делаете это несколько раз
источник
Добавление ответа более полного примера по сравнению с предыдущим ответом
<property name="propB_" value="${propA}"/> <loadresource property="propB"> <propertyresource name="propB_" /> <filterchain> <tokenfilter> <replaceregex pattern="\." replace="/" flags="g"/> </tokenfilter> </filterchain> </loadresource>
источник
Просто FYI для ответа. Замена символов в свойстве Ant - если вы пытаетесь использовать это внутри выполнения maven, вы не можете напрямую ссылаться на переменные maven. Вам понадобится что-то вроде этого:
... <target> <property name="propATemp" value="${propA}"/> <loadresource property="propB"> <propertyresource name="propATemp" /> ...
источник
" "
на"_"
?propATemp
, заменив его<propertyresource name="propATemp"/>
на<string value="${propA}"/>
Свойства нельзя изменить, но переменные antContrib ( http://ant-contrib.sourceforge.net/tasks/tasks/variable_task.html ) могут.
Вот макрос для поиска / замены переменной:
<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>
Затем вызовите макрос, например:
<ac:var name="updatedText" value="${oldText}"/> <current:replaceVarText varName="updatedText" from="." to="_" /> <echo message="Updated Text will be ${updatedText}"/>
В приведенном выше коде используется разделение javascript, а затем соединение, что быстрее, чем регулярное выражение. "локальные" свойства передаются в JavaScript, поэтому утечки свойств не происходит.
источник
Или ... Вы также можете попробовать свою задачу
КОД 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>
ПРИСТАВКА:
источник