替换Ant属性中的字符

abe*_*t80 86 string ant

是否有一种简单的方法来获取属性的值,然后将其复制到另一个属性,并替换某些字符?

propA=This is a value.我想将其中的所有空格替换为下划线,从而产生propB=This_is_a_value.

Uwe*_*ler 101

这是没有脚本的解决方案,也没有像ant-conrib这样的外部jar:

诀窍是使用ANT的资源:

  • 有一种名为"propertyresource"的资源类型,它类似于源文件,但提供了来自此资源的字符串值的流.因此,您可以加载它并在任何接受文件的"复制"任务中使用它
  • 还有任务"loadresource"可以将任何资源加载到属性(例如,文件),但是这个也可以加载我们的属性资源.此任务允许通过应用一些令牌转换来过滤输入.最后,以下将做你想要的:
<loadresource property="propB">
  <propertyresource name="propA"/>
  <filterchain>
    <tokenfilter>
      <filetokenizer/>
      <replacestring from=" " to="_"/>
    </tokenfilter>
  </filterchain>
</loadresource>
Run Code Online (Sandbox Code Playgroud)

这个将用"_"替换propA中的所有"",并将结果放在propB中."filetokenizer"将整个输入流(我们的属性)视为一个标记,并在其上应用字符串替换.

您可以使用其他令牌过滤器进行其他奇特的转换:http://ant.apache.org/manual/Types/filterchain.html

  • 谢谢!事实证明你甚至可以删除`<filetokenizer />`位.没有它你的代码工作正常(至少在Ant v1.8.3上). (7认同)
  • Upvote用于在vanilla`ant`中工作的技术,不需要额外的库. (3认同)
  • 这应该是IMO接受的答案 (2认同)

Jon*_*eet 87

使用Ant Contrib中propertyregex任务.

我想你想要:

<propertyregex property="propB"
               input="${propA}"
               regexp=" "
               replace="_"
               global="true" />
Run Code Online (Sandbox Code Playgroud)

不幸的是,给出的例子并不十分清楚,但值得尝试.您还应该检查如果没有任何下划线会发生什么 - 您可能也需要使用该defaultValue选项.

  • 添加`defaultValue ="$ {propA}"`作为一般搜索/替换单行是完美的:否则,如果没有匹配,没有任何东西被放入propB !! 谢谢! (3认同)

dna*_*ult 55

如果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>
Run Code Online (Sandbox Code Playgroud)

  • 如果使用此metod,最好将脚本包含在CDATA中以避免xml解析出现问题.<script language ="javascript"> <![CDATA [// java脚本代码可以安全地使用'<'字符.]]> </ script> (6认同)
  • @dnault Javascript没有字符串的`replaceAll`函数.请改用`before.replace(/\s/g,"_")`. (3认同)
  • @LarryBattle`project.getProperty()`返回一个`java.lang.String`,所以`replaceAll()`在这种情况下是合适的.如果你想使用`replace()`,你可以将'before'转换为原生的JavaScript字符串:`before = new String(before);` (3认同)

mga*_*ert 26

如果您想要一个使用Ant内置插件的解决方案,请考虑以下事项:

<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>
Run Code Online (Sandbox Code Playgroud)

输出是 ${propB} = "This_is_a_value"

  • 谁清理some.tmp.file? (2认同)

Jar*_*zek 8

使用像sed这样的外部应用程序:

<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot">
  <arg value="s/_/./g"/>
</exec>
<echo>${wersjaDot}</echo>
Run Code Online (Sandbox Code Playgroud)

如果您运行Windows,请使用Google搜索"gnuwin32 sed".

该命令s/_/./g取代了每一个_. windows下这个脚本顺利.在linux下arg可能需要引用.


Reb*_*bse 8

两种可能性:

通过脚本任务和内置的JavaScript引擎(如果使用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>
Run Code Online (Sandbox Code Playgroud)

或使用Ant插件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>
Run Code Online (Sandbox Code Playgroud)

覆盖现有属性propA只需用propA替换propB


Avi*_*h R 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>
Run Code Online (Sandbox Code Playgroud)

您可以按以下方式使用它:

<replaceproperty src="property1" dest="property2" replace=" " with="_"/>
Run Code Online (Sandbox Code Playgroud)

如果您多次这样做,这将非常有用