我有一个文件目录,我想使用Apache Ant(Linux上的1.7.1版)进行“就地”字符串过滤。
例如,假设在目录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
中的文件没有影响。 overwrite
参数默认为true
,move
Ant任务。我甚至摆弄了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>
可以首次尝试(没有临时文件)吗?
答案 0 :(得分:15)
请参阅replace任务:
<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"/>