プロパティの値を取得し、特定の文字を置き換えて別のプロパティにコピーする簡単な方法はありますか?
いう propA=This is a value
。その中のすべてのスペースをアンダースコアに置き換えて、propB=This_is_a_value
。
Ant Contrib の propertyregex タスクを使用します。
あなたが欲しいと思う:
<propertyregex property="propB"
input="${propA}"
regexp=" "
replace="_"
global="true" />
残念ながら、与えられた例はそれほど明確ではありませんが、試してみる価値はあります。また、アンダースコアがない場合はどうなるかを確認する必要があります-defaultValue
オプションも使用する必要があります。
スクリプトを使用せず、ant-conribのような外部jarを使用しないソリューションを次に示します。
トリックは、ANTのリソースを使用することです。
<loadresource property="propB">
<propertyresource name="propA"/>
<filterchain>
<tokenfilter>
<filetokenizer/>
<replacestring from=" " to="_"/>
</tokenfilter>
</filterchain>
</loadresource>
これは、propAのすべての「」を「_」で置き換え、結果をpropBに入れます。 「filetokenizer」は、入力ストリーム(プロパティ)全体を1つのトークンとして扱い、それに文字列置換を適用します。
他のトークンフィルターを使用して、他の派手な変換を行うことができます: 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ビルトインonlyを使用するソリューションが必要な場合は、次のことを考慮してください。
<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"
2つの可能性:
スクリプトタスクおよび組み込み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に置き換えます
Sedのような外部アプリを使用します。
<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot">
<arg value="s/_/./g"/>
</exec>
<echo>${wersjaDot}</echo>
Windowsを実行している場合は、「gnuwin32 sed」のグーグル検索を入手してください。
コマンド s/_/./g
はすべての_
with .
このスクリプトは、Windowsでも問題ありません。 Linuxでは、引数に引用符が必要な場合があります。
we Schindler's 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="_"/>
これを複数回行う場合、これは非常に便利です
前の回答 にさらに完全な回答を追加する
<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" />
...
または... Your Own Task を試すこともできます
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