Замена символов в свойстве Ant
Есть ли простой способ взять значение свойства, а затем скопировать его в другое свойство с замененными символами?
Скажите propA=This is a value
. Я хочу заменить все пробелы в нем символами подчеркивания, в результате получим propB=This_is_a_value
.
Ответы
Ответ 1
Используйте propertyregex задачу из Ant Contrib.
Я думаю, вы хотите:
<propertyregex property="propB"
input="${propA}"
regexp=" "
replace="_"
global="true" />
К сожалению, приведенные примеры не очень ясны, но это стоит попробовать. Вы также должны проверить, что произойдет, если нет каких-либо подчеркиваний - вам может понадобиться также использовать параметр defaultValue
.
Ответ 2
Вот решение без скриптов и никаких внешних банок, таких как ant -conrib:
Трюк заключается в использовании ресурсов ANT:
- Существует один тип ресурса, называемый "propertyresource", который похож на исходный файл, но предоставляет поток из строкового значения этого ресурса. Таким образом, вы можете загрузить его и использовать в любой задаче, например, "copy", которая принимает файлы
- Существует также задача "loadresource", которая может загружать любой ресурс в свойство (например, файл), но это также может загрузить наш ресурс propertyresource. Эта задача позволяет фильтровать входные данные, применяя некоторые преобразования токенов. Наконец, следующее будет делать то, что вы хотите:
<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
Ответ 3
Если 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>
Ответ 4
Если вам нужно решение, которое использует 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"
Ответ 5
Используйте какое-то внешнее приложение, например sed:
<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot">
<arg value="s/_/./g"/>
</exec>
<echo>${wersjaDot}</echo>
Если вы запустите Windows, запустите его для поиска gnuwin32 sed.
Команда s/_/./g
заменяет каждый _
на .
Этот script хорошо подходит для окон. Под linux arg может потребоваться цитата.
Ответ 6
Две возможности:
через script задачу и встроенный механизм 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
Ответ 7
Здесь более обобщенная версия Uwe Schindler answer:
Вы можете использовать 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="_"/>
это будет очень полезно, если вы делаете это несколько раз
Ответ 8
Добавление ответа более полного примера через предыдущий ответ
<property name="propB_" value="${propA}"/>
<loadresource property="propB">
<propertyresource name="propB_" />
<filterchain>
<tokenfilter>
<replaceregex pattern="\." replace="/" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
Ответ 9
Просто FYI для ответа Замена символов в свойстве Ant - если вы пытаетесь использовать это внутри выполнения maven, вы не можете ссылаться на переменные maven непосредственно. Вам понадобится что-то вроде этого:
...
<target>
<property name="propATemp" value="${propA}"/>
<loadresource property="propB">
<propertyresource name="propATemp" />
...
Ответ 10
Или... Вы также можете попробовать Собственная задача
КОД 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