Замена символов в свойстве Ant
Есть ли простой способ получить значение свойства, а затем скопировать его в другое свойство с заменой определенных символов?
Сказать propA=This is a value
, Я хочу заменить все пробелы в ней на подчеркивание, в результате чего propB=This_is_a_value
,
10 ответов
Используйте задачу propertyregex из Ant Contrib.
Я думаю, что вы хотите:
<propertyregex property="propB"
input="${propA}"
regexp=" "
replace="_"
global="true" />
К сожалению, приведенные примеры не очень понятны, но стоит попробовать. Вы также должны проверить, что происходит, если нет подчеркивания - вам может понадобиться defaultValue
вариант также.
Вот решение без сценариев и внешних jar-файлов, таких как ant-conrib:
Хитрость заключается в том, чтобы использовать ресурсы ANT:
- Существует один тип ресурса, называемый "propertyresource", который похож на исходный файл, но предоставляет поток из строкового значения этого ресурса. Таким образом, вы можете загрузить его и использовать в любой задаче, например "копировать", которая принимает файлы
- Существует также задача "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
Если 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>
Если вам нужно решение, которое использует только встроенные 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"
Вот более обобщенная версия ответа Уве Шиндлера:
Вы можете использовать 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="_"/>
это будет очень полезно, если вы делаете это несколько раз
Используйте внешнее приложение, такое как sed:
<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot">
<arg value="s/_/./g"/>
</exec>
<echo>${wersjaDot}</echo>
Если вы запускаете Windows, найдите gugling для "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 аддон 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
Добавление более полного примера ответа к предыдущему ответу
<property name="propB_" value="${propA}"/>
<loadresource property="propB">
<propertyresource name="propB_" />
<filterchain>
<tokenfilter>
<replaceregex pattern="\." replace="/" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
Просто для справки: ответ Замена символов в свойстве Ant - если вы пытаетесь использовать это внутри выполнения maven, вы не можете напрямую ссылаться на переменные maven. Вам понадобится что-то вроде этого:
...
<target>
<property name="propATemp" value="${propA}"/>
<loadresource property="propB">
<propertyresource name="propATemp" />
...
Свойства нельзя изменить, но переменные 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:
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>
ПРИСТАВКА:
run:
[echo] propA=This is a value
[echo] propB=This_is_a_value