มีวิธีง่ายๆในการรับค่าของคุณสมบัติแล้วคัดลอกไปยังคุณสมบัติอื่นโดยแทนที่อักขระบางตัวหรือไม่?
พูดpropA=This is a value
. propB=This_is_a_value
ฉันต้องการที่จะแทนที่ช่องว่างทั้งหมดในนั้นเข้าไปในขีดที่เกิดใน
มีวิธีง่ายๆในการรับค่าของคุณสมบัติแล้วคัดลอกไปยังคุณสมบัติอื่นโดยแทนที่อักขระบางตัวหรือไม่?
พูดpropA=This is a value
. propB=This_is_a_value
ฉันต้องการที่จะแทนที่ช่องว่างทั้งหมดในนั้นเข้าไปในขีดที่เกิดใน
คำตอบ:
ใช้propertyregexงานจากมด Contrib
ฉันคิดว่าคุณต้องการ:
<propertyregex property="propB"
input="${propA}"
regexp=" "
replace="_"
global="true" />
น่าเสียดายที่ตัวอย่างที่ให้มานั้นไม่ชัดเจนมากนัก แต่ก็คุ้มค่าที่จะลองดู คุณควรตรวจสอบสิ่งที่เกิดขึ้นหากไม่มีเครื่องหมายขีดล่าง - คุณอาจต้องใช้defaultValue
ตัวเลือกนี้ด้วย
นี่คือวิธีแก้ปัญหาโดยไม่ต้องเขียนสคริปต์และไม่มีขวดภายนอกเช่น 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()
คืนค่า a java.lang.String
ดังนั้นจึงreplaceAll()
เหมาะสมในกรณีนี้ หากคุณต้องการใช้replace()
คุณสามารถแปลง 'before' เป็นสตริง JavaScript ดั้งเดิมด้วย:before = new String(before);
project.setNewProperty
จะพกพาได้มากขึ้นเนื่องจากsetProperty
สามารถเขียนทับมูลค่าทรัพย์สินเก่าได้ มันสามารถเขียนถึงbefore
คุณสมบัติ
ในกรณีที่คุณต้องการโซลูชันที่ใช้ Ant built-in เท่านั้นให้พิจารณาสิ่งนี้:
<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 ให้ใช้ googling สำหรับ "gnuwin32 sed"
คำสั่งs/_/./g
แทนที่ทุก_
ด้วย.
สคริปต์นี้ทำงานได้ดีภายใต้หน้าต่าง ภายใต้อาร์กิวเมนต์ลินุกซ์อาจต้องมีการอ้างอิง
ความเป็นไปได้สองประการ:
ผ่านงานสคริปต์และเอ็นจิ้นจาวาสคริปต์ในตัว (หากใช้ 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
นี่คือคำตอบของUwe Schindler ในเวอร์ชันทั่วไป :
คุณสามารถใช้ a 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 ) สามารถ
นี่คือมาโครสำหรับค้นหา / แทนที่ใน 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>
จากนั้นเรียกมาโครเช่น:
<ac:var name="updatedText" value="${oldText}"/>
<current:replaceVarText varName="updatedText" from="." to="_" />
<echo message="Updated Text will be ${updatedText}"/>
โค้ดด้านบนใช้การแยกจาวาสคริปต์แล้วเข้าร่วมซึ่งเร็วกว่า regex คุณสมบัติ "local" จะถูกส่งต่อไปยัง 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
defaultValue="${propA}"
นั้นสมบูรณ์แบบเหมือนการค้นหาทั่วไป / แทนที่ one-liner มิฉะนั้นหากไม่มีการจับคู่จะไม่มีอะไรใส่ propB !! ขอบคุณ!