使用Ant在原地过滤文件?

17

我有一个文件目录,想要在Apache Ant(版本1.7.1,运行于Linux上)中使用“原地”字符串过滤。

例如,假设在目录mydir中,有文件foobarbaz。进一步假设正则表达式OLD([0-9])的所有出现都应该被改为NEW\1,例如OLD2NEW2。(请注意,replace Ant任务无法使用正则表达式过滤。)

可以使用以下Bash命令创建此测试情况(ant将在当前目录下运行,即mydir的父目录):

mkdir mydir
for FILE in foo bar baz ; do echo "A OLD1 B OLD2 C OLD3" > mydir/${FILE} ; done

这是我第一次尝试使用Ant进行过滤:

<?xml version="1.0"?>
<project name="filter" default="filter">
    <target name="filter">
        <move todir="mydir">
            <fileset dir="mydir"/>
            <filterchain>
                <tokenfilter>
                    <replaceregex pattern="OLD([0-9])" replace="NEW\1" flags="g"/>
                </tokenfilter>
            </filterchain>
        </move>
    </target>
</project>

运行这个第一个Ant脚本不会对mydir中的文件产生影响。使用move Ant任务时,默认情况下overwrite参数为true。我甚至尝试了调整granularity设置,但并没有起到帮助作用。

这是我的第二次尝试,虽然有些麻烦因为需要创建临时文件,但“可行”。这个版本通过将内容移动到带有filtered后缀的文件中来正确过滤内容,然后再将过滤后的内容“移回”原始文件名:

<?xml version="1.0"?>
<project name="filter" default="filter">
    <target name="filter">
        <move todir="mydir">
            <globmapper from="*" to="*.filtered"/>
            <fileset dir="mydir"/>
            <filterchain>
                <tokenfilter>
                    <replaceregex pattern="OLD([0-9])" replace="NEW\1" flags="g"/>
                </tokenfilter>
            </filterchain>
        </move>
        <move todir="mydir">
            <globmapper from="*.filtered" to="*"/>
            <fileset dir="mydir"/>
        </move>
    </target>
</project>

第一次尝试(不使用临时文件)可以工作吗?

1个回答

15

请查看替换任务:

<replace 
   dir="mydir" 
   includes="foo, bar, baz">
   <replacefilter token="OLD" value="NEW" />
</replace>

或使用 replaceregexp 任务:

<replaceregexp
    file="${src}/build.properties"
    match="OldProperty=(.*)"
    replace="NewProperty=\1"
    byline="true"/>

谢谢,但事实证明我的问题是不完整的。当我写这个问题时,我把我的生产代码“简化”得太多了。我忽略了需要正则表达式过滤的需求,而replace似乎不支持(如果我错了,请纠正我!)。您已经为不需要正则表达式的情况给出了很好的答案。 - Greg Mattes
2
在这种情况下,请查看可选的replaceregexp任务:http://ant.apache.org/manual/OptionalTasks/replaceregexp.html - Kevin
1
可选任务!真是天才!我可能在我的生命中只看过两次Ant的可选任务。完全忘记它们了。谢谢!请使用replaceregexp任务添加一个新的答案,或者编辑这个答案,我会接受它。这里,我会让它变得容易(注意flags="g"以捕获所有出现的情况):< replaceregexp match = "OLD ([0-9])" replace = "NEW\1" flags = "g"> <fileset dir ="mydir"/> </ replaceregexp> - Greg Mattes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接