У меня есть каталог файлов, для которого я хотел бы выполнить «строковую» фильтрацию строк с помощью Apache Ant (версия 1.7.1 в Linux).
Например, предположим, что в каталоге mydir
у меня есть файлы foo
, bar
и baz
. Далее предположим, что все вхождения регулярного выражения OLD([0-9])
должны быть изменены на NEW\1
, например OLD2
& rarr; NEW2
. (Обратите внимание, что задача Ant replace
не будет работать, поскольку она не поддерживает фильтрацию регулярных выражений.)
Эту тестовую ситуацию можно создать с помощью следующих команд 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
с заданием Ant move
. Я даже возился с настройкой 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>
Можно ли сработать с первой попытки (без временных файлов)?