পিঁপড়ের সম্পত্তিতে অক্ষর প্রতিস্থাপন


90

কোনও সম্পত্তির মূল্য নেওয়ার এবং তারপরে নির্দিষ্ট অক্ষরগুলির পরিবর্তে এটি অন্য কোনও সম্পত্তিতে অনুলিপি করার কোনও সহজ উপায় আছে?

বলুন propA=This is a value। আমি এর সমস্ত স্পেসগুলি আন্ডারস্কোরগুলিতে প্রতিস্থাপন করতে চাই, যার ফলস্বরূপ propB=This_is_a_value

উত্তর:


89

পিঁপড়ের কন্ট্রিবি থেকে প্রপার্টিজেজ টাস্ক ব্যবহার করুন

আমি মনে করি আপনি চান:

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

দুর্ভাগ্যক্রমে প্রদত্ত উদাহরণগুলি অত্যন্ত পরিষ্কার নয়, তবে এটি চেষ্টা করার মতো worth কোনও আন্ডারস্কোর না থাকলে কী হয় তাও আপনার পরীক্ষা করা উচিত - আপনার defaultValueপাশাপাশি বিকল্পটিও ব্যবহার করতে হতে পারে ।


4
যুক্ত defaultValue="${propA}"করা সাধারণ অনুসন্ধান হিসাবে নিখুঁত / এক-লাইনার প্রতিস্থাপন: অন্যথায়, যদি কোনও মিল না থাকে তবে কিছুই প্রোপবিতে রাখা হয় না !! ধন্যবাদ!
ডেভিড রবসন

107

এখানে স্ক্রিপ্টিং ছাড়াই সমাধান এবং কোনও পিঁপড়ের মতো কোনও বাহ্যিক জার নেই:

কৌশলটি হ'ল এএনটির সংস্থানগুলি ব্যবহার করা:

  • "প্রপার্টি রিসোর্স" নামে একটি উত্সের ধরণ রয়েছে যা উত্স ফাইলের মতো তবে এই সংস্থানটির স্ট্রিং মান থেকে একটি স্ট্রিম সরবরাহ করে। সুতরাং আপনি এটিকে লোড করতে এবং ফাইলগুলি গ্রহণ করে এমন "অনুলিপি" এর মতো কোনও কাজে ব্যবহার করতে পারেন
  • "লোড্রেসোর্স" টাস্কটিও রয়েছে যা কোনও সংস্থায় কোনও সংস্থান (যেমন, কোনও ফাইল) লোড করতে পারে তবে এটি আমাদের সম্পত্তি সম্পদ লোড করতে পারে। এই টাস্কটি কিছু টোকেন রূপান্তর প্রয়োগ করে ইনপুট ফিল্টার করার অনুমতি দেয় allows অবশেষে নীচেরগুলি আপনি যা চান তা করবে:
<loadresource property="propB">
  <propertyresource name="propA"/>
  <filterchain>
    <tokenfilter>
      <filetokenizer/>
      <replacestring from=" " to="_"/>
    </tokenfilter>
  </filterchain>
</loadresource>

এটি এক "_" দ্বারা প্রোপায় সমস্ত "" প্রতিস্থাপন করবে এবং ফলাফলটি প্রোপিবিতে রাখবে। "ফাইল টোকনাইজার" পুরো ইনপুট স্ট্রিমটিকে (আমাদের সম্পত্তি) এক টোকেন হিসাবে বিবেচনা করে এবং এতে স্ট্রিং প্রতিস্থাপন প্রয়োগ করে।

আপনি অন্যান্য টোকেনফিল্টার ব্যবহার করে অন্যান্য অভিনব ট্রান্সফরমেশনগুলি করতে পারেন: http://ant.apache.org/manual/Typees/filterchain.html


7
ধন্যবাদ! দেখা যাচ্ছে আপনি এমনকি <filetokenizer/>কিছুটা ফেলে দিতে পারেন । আপনার কোডটি এগুলি ব্যতীত দুর্দান্ত কাজ করে (কমপক্ষে পিঁপড়া v1.8.3 এ)।
ম্যাথিয়াস

আপনি ম্যাভেন-এ গিয়ে করতে চেষ্টা হয়, দেখতে stackoverflow.com/a/22969187/2163960
user2163960

4
ভ্যানিলাতে কাজ করে এমন কোনও প্রযুক্তিটির জন্য আপভোট করুন antএবং অতিরিক্ত লাইব্রেরির প্রয়োজন নেই।
ক্রিস্টোফার শুল্টজ

57

যদি পিঁপড়া-অবদান কোনও বিকল্প না হয় তবে জাভা ১.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
যদি এই মেটোড ব্যবহার করা হয় তবে এক্সডিএমএল পার্সিংয়ের সমস্যা এড়াতে সিডিএটিএতে স্ক্রিপ্টটি বন্ধ করা ভাল। <স্ক্রিপ্ট ভাষা = "জাভাস্ক্রিপ্ট"> <! [সিডিএটিএ [// জাভা স্ক্রিপ্ট কোড নিরাপদে '<' অক্ষর ব্যবহার করতে পারে। ]]> </ স্ক্রিপ্ট>
জানুয়ার আর্কিচিউভিজ

4
@dnault জাভাস্ক্রিপ্টের replaceAllস্ট্রিংয়ের জন্য কোনও ফাংশন নেই। before.replace( /\s/g, "_" )পরিবর্তে ব্যবহার করুন।
ল্যারি ব্যাটেল

4
@ ল্যারিবাটল project.getProperty()একটি ফেরত দেয় java.lang.String, তাই replaceAll()এই ক্ষেত্রে উপযুক্ত। আপনি যদি ব্যবহার করতে চান replace(), আপনি এর সাথে একটি 'জাভাস্ক্রিপ্ট স্ট্রিং' এর আগে 'পূর্বে' রূপান্তর করতে পারেন:before = new String(before);
ডেনাল্ট

4
project.setNewPropertysetPropertyপুরানো সম্পত্তি মান ওভাররাইট করতে পারে হিসাবে আরও পোর্টেবল হতে পারে। এটি beforeসম্পত্তি লিখতে পারে ।
Jarekczek

এটির জন্য
গন্ডার

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"


4
কে কিছু.tmp.file পরিষ্কার করে?
23:54

যেহেতু অন্যরা এটি ব্যবহার করতে চাইতে পারে; <লোড ফাইল = "some.tmp.file" /> << লোড ফাইলের পরে যোগ করুন। প্রশ্নের উত্তরের @ প্রশ্নের উত্তর :)
terix2k11

8

বাহির মতো কিছু বাহ্যিক অ্যাপ্লিকেশন ব্যবহার করুন:

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

আপনি যদি উইন্ডোজ চালনা করেন তবে এটি "gnuwin32 সেড" এর জন্য গুগল হয়ে উঠবে।

কমান্ড 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>

বা পিঁপড়া অ্যাডন ফ্লাকা ব্যবহার করে

<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

উউ শিন্ডলারের উত্তরের আরও সাধারণ সংস্করণ এখানে :

আপনি 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="_"/>

আপনি একাধিক বার এটি করতে পারলে এটি বেশ কার্যকর হবে


3

পূর্ববর্তী উত্তরের চেয়ে একটি উত্তর আরও সম্পূর্ণ উদাহরণ যুক্ত করা

<property name="propB_" value="${propA}"/>
<loadresource property="propB">
  <propertyresource name="propB_" />
  <filterchain>
    <tokenfilter>
      <replaceregex pattern="\." replace="/" flags="g"/>
    </tokenfilter>
  </filterchain>
</loadresource>

1

পিঁপড়ের সম্পত্তিতে অক্ষরের পরিবর্তে উত্তরের জন্য কেবল একটি এফওয়াইআই - আপনি যদি কোনও ম্যভেন এক্সিকিউশনের অভ্যন্তরে এটি ব্যবহার করার চেষ্টা করছেন তবে আপনি সরাসরি মেভেন ভেরিয়েবলগুলি উল্লেখ করতে পারবেন না। আপনার এই জাতীয় কিছু প্রয়োজন হবে:

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

প্রতিস্থাপন কী অংশের সাথে সম্পর্কিত " "করার "_"?
জিন কোওন

বিকল্পভাবে ম্যাভেন, আপনি ব্যবহার সম্পত্তিতে প্রয়োজন এড়াতে পারে propATemp প্রতিস্থাপন <propertyresource name="propATemp"/>সঙ্গে<string value="${propA}"/>
এড রান্ডাল

1

বৈশিষ্ট্যগুলি পরিবর্তন করা যায় না তবে এন্টকন্ট্রিব ভার্স ( http://ant-contrib.sourceforge.net/tasks/tasks/variable_task.html ) পারে।

এখানে কোনও ভারে সন্ধান / প্রতিস্থাপন করার জন্য একটি ম্যাক্রো দেওয়া হয়েছে:

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

অ্যান্টি স্ক্রিপ্ট

...
<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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.