Подтвердить что ты не робот

Фильтрация файлов на месте с помощью Ant?

У меня есть каталог файлов, для которых я хочу сделать "на месте" строчную фильтрацию с помощью Apache Ant (версия 1.7.1 в Linux).

Например, предположим, что в каталоге mydir у меня есть файлы foo, bar и baz. Далее предположим, что все вхождения регулярного выражения 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 script не влияет на файлы в 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>

Можно ли заставить первую попытку (без временных файлов) работать?

4b9b3361

Ответ 1

Смотрите задачу 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"/>