string - चींटी संपत्ति में अक्षर बदलना




ant (7)

क्या किसी संपत्ति का मूल्य लेने का एक आसान तरीका है और फिर इसे किसी अन्य संपत्ति में प्रतिस्थापित कर दिया गया है जिसमें कुछ वर्ण बदल दिए गए हैं?

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


Sed जैसे कुछ बाहरी ऐप का प्रयोग करें:

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

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

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


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

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

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

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

या चींटी एडन फ्लाका का उपयोग कर

<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>

exisiting संपत्ति propa ओवरराइट करने के लिए बस propa के साथ propb को प्रतिस्थापित करें


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

<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"


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

जावा कोड:

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..

एंट स्क्रिप

...
<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

स्क्रिप्टिंग के बिना समाधान और एंटी-कॉनब्रिड जैसे बाहरी जार नहीं हैं:

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

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

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

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


उवे स्किंडलर के उत्तर का एक और सामान्यीकृत संस्करण यहां दिया गया है :

कस्टम कार्य बनाने के लिए आप 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="_"/>

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







ant