我有一个文件目录,想要在Apache Ant(版本1.7.1,运行于Linux上)中使用“原地”字符串过滤。
例如,假设在目录mydir
中,有文件foo
、bar
和baz
。进一步假设正则表达式OLD([0-9])
的所有出现都应该被改为NEW\1
,例如OLD2
→ NEW2
。(请注意,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>
第一次尝试(不使用临时文件)可以工作吗?