Adakah cara sederhana untuk mengambil nilai sebuah properti dan kemudian menyalinnya ke properti lain dengan mengganti karakter tertentu?
Katakan propA=This is a value
. Saya ingin mengganti semua spasi di dalamnya menjadi garis bawah, menghasilkan propB=This_is_a_value
.
defaultValue="${propA}"
sempurna sebagai pencarian umum / ganti satu baris: jika tidak, jika tidak ada yang cocok, tidak ada yang dimasukkan ke propB !! Terima kasih!Berikut solusinya tanpa scripting dan tidak ada stoples eksternal seperti ant-conrib:
Triknya adalah dengan menggunakan sumber daya ANT:
<loadresource property="propB"> <propertyresource name="propA"/> <filterchain> <tokenfilter> <filetokenizer/> <replacestring from=" " to="_"/> </tokenfilter> </filterchain> </loadresource>
Yang ini akan mengganti semua "" di propA dengan "_" dan menempatkan hasilnya di propB. "filetokenizer" memperlakukan seluruh aliran input (properti kami) sebagai satu token dan menerapkan penggantian string di atasnya.
Anda dapat melakukan transformasi mewah lainnya menggunakan tokenfilters lain: http://ant.apache.org/manual/Types/filterchain.html
sumber
<filetokenizer/>
sedikit. Kode Anda berfungsi dengan baik tanpanya (setidaknya di Ant v1.8.3).ant
dan tidak memerlukan pustaka tambahan.Jika ant-contrib bukan pilihan, berikut adalah solusi portabel untuk Java 1.6 dan yang lebih baru:
<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>
sumber
replaceAll
fungsi untuk string. Gunakanbefore.replace( /\s/g, "_" )
sebagai gantinya.project.getProperty()
mengembalikan ajava.lang.String
, jadireplaceAll()
cocok dalam kasus ini. Jika Anda ingin menggunakanreplace()
, Anda dapat mengonversi 'sebelum' menjadi string JavaScript asli dengan:before = new String(before);
project.setNewProperty
akan lebih portabel, karenasetProperty
dapat menimpa nilai properti lama. Ia bahkan bisa menulis kebefore
properti.Jika anda ingin solusi yang tidak menggunakan Ant built-in hanya , pertimbangkan ini:
<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>
Outputnya adalah
${propB} = "This_is_a_value"
sumber
Gunakan beberapa aplikasi eksternal seperti sed:
<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot"> <arg value="s/_/./g"/> </exec> <echo>${wersjaDot}</echo>
Jika Anda menjalankan Windows, dapatkan itu googling untuk "gnuwin32 sed".
Perintah
s/_/./g
menggantikan setiap_
dengan.
Skrip ini berjalan dengan baik di bawah jendela. Di bawah linux arg mungkin perlu kutipan.sumber
Dua kemungkinan:
melalui tugas skrip dan mesin javascript bawaan (jika menggunakan 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>
atau menggunakan 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>
untuk menimpa properti propA yang ada cukup ganti propB dengan propA
sumber
Berikut adalah versi jawaban Uwe Schindler yang lebih umum :
Anda dapat menggunakan a
macrodef
untuk membuat tugas kustom.<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>
Anda dapat menggunakan ini sebagai berikut:
<replaceproperty src="property1" dest="property2" replace=" " with="_"/>
ini akan sangat berguna jika Anda melakukan ini beberapa kali
sumber
Menambahkan contoh jawaban yang lebih lengkap dari jawaban sebelumnya
<property name="propB_" value="${propA}"/> <loadresource property="propB"> <propertyresource name="propB_" /> <filterchain> <tokenfilter> <replaceregex pattern="\." replace="/" flags="g"/> </tokenfilter> </filterchain> </loadresource>
sumber
Hanya FYI untuk jawaban Mengganti karakter di properti Ant - jika Anda mencoba menggunakan ini di dalam eksekusi maven, Anda tidak dapat mereferensikan variabel maven secara langsung. Anda akan membutuhkan sesuatu seperti ini:
... <target> <property name="propATemp" value="${propA}"/> <loadresource property="propB"> <propertyresource name="propATemp" /> ...
sumber
" "
ke"_"
?propATemp
dengan mengganti<propertyresource name="propATemp"/>
dengan<string value="${propA}"/>
Properti tidak dapat diubah tetapi vars antContrib ( http://ant-contrib.sourceforge.net/tasks/tasks/variable_task.html ) bisa.
Berikut adalah makro untuk melakukan pencarian / penggantian pada var:
<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>
Kemudian panggil makro seperti:
<ac:var name="updatedText" value="${oldText}"/> <current:replaceVarText varName="updatedText" from="." to="_" /> <echo message="Updated Text will be ${updatedText}"/>
Kode di atas menggunakan javascript split kemudian join, yang lebih cepat dari regex. properti "lokal" diteruskan ke JavaScript sehingga tidak ada kebocoran properti.
sumber
Atau ... Anda juga dapat mencoba Tugas Anda Sendiri
KODE JAWA:
SKRIP SEMUT
... <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>
MENGHIBUR:
sumber