चींटी की संपत्ति में पात्रों की जगह


90

क्या किसी संपत्ति के मूल्य को लेने का एक सरल तरीका है और फिर उसे कुछ संपत्तियों के साथ दूसरी संपत्ति में कॉपी किया जाए?

कहते हैं propA=This is a value। मैं इसमें सभी रिक्त स्थान को अंडरस्कोर में बदलना चाहता हूं, जिसके परिणामस्वरूप propB=This_is_a_value

जवाबों:


89

चींटी कंट्रिब से प्रॉपर्टीज के कार्य का उपयोग करें ।

मुझे लगता है कि आप चाहते हैं:

<propertyregex property="propB"
               input="${propA}"
               regexp=" "
               replace="_"
               global="true" />

दुर्भाग्य से दिए गए उदाहरण बहुत स्पष्ट नहीं हैं, लेकिन यह कोशिश करने लायक है। आपको यह भी जांचना चाहिए कि क्या होता है अगर कोई अंडरस्कोर नहीं है - आपको defaultValueविकल्प का उपयोग करने की आवश्यकता हो सकती है ।


3
जोड़ना defaultValue="${propA}"एक सामान्य खोज के रूप में परिपूर्ण है / एक-लाइनर को प्रतिस्थापित करें: अन्यथा, अगर कोई मैच नहीं है, तो कुछ भी प्रोब में नहीं डाला जाता है !! धन्यवाद!
डेविड रॉबसन

107

यहाँ स्क्रिप्टिंग के बिना हल है और कोई बाहरी जार जैसे कि एंटी-कॉनरिब:

चाल ANT के संसाधनों का उपयोग करना है:

  • "रिसोर्ससोर्स" नामक एक संसाधन प्रकार है, जो एक स्रोत फ़ाइल की तरह है, लेकिन इस संसाधन के स्ट्रिंग मान से एक स्ट्रीम प्रदान करता है। तो आप इसे लोड कर सकते हैं और इसे "कॉपी" जैसे किसी भी कार्य में उपयोग कर सकते हैं जो फ़ाइलों को स्वीकार करता है
  • कार्य "लोडसोर्स" भी है जो किसी भी संसाधन को संपत्ति में लोड कर सकता है (उदाहरण के लिए, एक फ़ाइल), लेकिन यह भी हमारे संपत्ति स्रोत को लोड कर सकता है। यह कार्य कुछ टोकन परिवर्तनों को लागू करके इनपुट को फ़िल्टर करने की अनुमति देता है। अंत में निम्नलिखित आप क्या चाहते हैं:
<loadresource property="propB">
  <propertyresource name="propA"/>
  <filterchain>
    <tokenfilter>
      <filetokenizer/>
      <replacestring from=" " to="_"/>
    </tokenfilter>
  </filterchain>
</loadresource>

यह एक प्रोप में सभी "" द्वारा प्रतिस्थापित करेगा "_" और परिणाम को प्रोप में रखें। "filetokenizer" पूरे इनपुट स्ट्रीम (हमारी संपत्ति) को एक टोकन मानता है और उस पर स्ट्रिंग प्रतिस्थापन को लागू करता है।

आप अन्य टोकन परिवर्तन का उपयोग करके अन्य फैंसी बदलाव कर सकते हैं: http://ant.apache.org/manual/Types/filterchain.html


7
धन्यवाद! यह पता चला है कि आप <filetokenizer/>थोड़ा भी छोड़ सकते हैं । आपका कोड इसके बिना ठीक काम करता है (कम से कम चींटी v1.8.3 पर)।
मथायस

यदि आप मावेन के भीतर से ऐसा करने की कोशिश कर रहे हैं, तो stackoverflow.com/a/22969187/2163960
user2163960

3
वेनिला में काम करने वाली तकनीक के लिए अपवोट antऔर अतिरिक्त पुस्तकालयों की आवश्यकता नहीं है।
क्रिस्टोफर शुल्त्स

57

यदि एंटी-कंट्रीब एक विकल्प नहीं है, तो यहां जावा 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>

6
यदि इस मेट्रो का उपयोग किया जाता है, तो xml पार्सिंग के साथ समस्याओं से बचने के लिए CDATA में स्क्रिप्ट संलग्न करना अच्छा होगा। <script भाषा = "javascript"> <! [CDATA [// java script code सुरक्षित रूप से '<' अक्षर का उपयोग कर सकते हैं। ]]> </ script>
Jan Arciuchiewicz

3
@dnault जावास्क्रिप्ट replaceAllतार के लिए एक समारोह नहीं है । before.replace( /\s/g, "_" )इसके बजाय उपयोग करें ।
लैरी बैटल

3
@LarryBattle project.getProperty()एक वापसी करता है java.lang.String, इसलिए replaceAll()इस मामले में उचित है। यदि आप उपयोग करना चाहते हैं replace(), तो आप 'से पहले' को एक देशी जावास्क्रिप्ट स्ट्रिंग के साथ बदल सकते हैं:before = new String(before);
dnault

1
project.setNewPropertysetPropertyपुरानी संपत्ति के मूल्य को अधिलेखित करने के रूप में अधिक पोर्टेबल होगा । यह beforeसंपत्ति के लिए भी लिख सकता है।
जारेकाइक

इसके लिए राइनो
vintproykt

26

यदि आप ऐसा समाधान चाहते हैं जो केवल चींटी निर्मित इन्स का उपयोग करता है , तो इस पर विचार करें:

<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} = &quot;${propB}&quot;" />
</target>

आउटपुट है ${propB} = "This_is_a_value"


2
कौन कुछ साफ करता है। tmp.file?
ceving

चूंकि अन्य लोग इसका उपयोग करना चाहते हैं; </ Loadfile> के बाद <Delete फ़ाइल = "some.tmp.file" /> जोड़ें। उत्तर @ceving Question :)
terix2k11

8

कुछ बाहरी ऐप जैसे कि sed का उपयोग करें:

<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot">
  <arg value="s/_/./g"/>
</exec>
<echo>${wersjaDot}</echo>

यदि आप विंडोज चलाते हैं तो इसे "gnuwin32 sed" के लिए googling मिलता है।

आदेश s/_/./gहर की जगह _के साथ . यह स्क्रिप्ट खिड़कियों के तहत अच्छी तरह से चला जाता है। लिनक्स अर्ग के तहत उद्धृत करने की आवश्यकता हो सकती है।


8

दो संभावनाएँ:

स्क्रिप्ट टास्क और बिलिन जावास्क्रिप्ट इंजन के माध्यम से (यदि 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>

या चींटी 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>

संपत्ति के प्रसार को अधिलेखित करने के लिए बस प्रोप के साथ प्रोप को बदलें


7

यहाँ Uwe Schindler के उत्तर का अधिक सामान्यीकृत संस्करण है :

आप 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="_"/>

यदि आप कई बार ऐसा कर रहे हैं तो यह बहुत उपयोगी होगा



1

चींटी संपत्ति में वर्णों को प्रतिस्थापित करने के लिए बस एक FYI करें - यदि आप मावेन निष्पादन के अंदर इसका उपयोग करने का प्रयास कर रहे हैं, तो आप सीधे मावेन चर का संदर्भ नहीं दे सकते। आपको कुछ इस तरह की आवश्यकता होगी:

...
<target>
<property name="propATemp" value="${propA}"/>
    <loadresource property="propB">
    <propertyresource name="propATemp" />
...

किस जगह " "से संबंधित भागों "_"?
जिन क्वॉन

वैकल्पिक रूप से मावेन में, आप के साथ की propATemp जगह संपत्ति का उपयोग करने की आवश्यकता से बच सकते हैं<propertyresource name="propATemp"/><string value="${propA}"/>
एड Randall

1

गुण परिवर्तित नहीं किए जा सकते, लेकिन एंटीकंट्री वर्जन ( 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}"/>

ऊपर का कोड जावास्क्रिप्ट विभाजन का उपयोग करता है, फिर जुड़ता है, जो रेगेक्स से तेज है। "स्थानीय" गुणों को जावास्क्रिप्ट में पारित किया जाता है ताकि कोई संपत्ति रिसाव न हो।


0

या ... आप अपना खुद का टास्क भी आजमा सकते हैं

जावा कोड:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.