Фильтрация файлов на месте с помощью Ant? - PullRequest
17 голосов
/ 23 апреля 2009

У меня есть каталог файлов, для которого я хотел бы выполнить «строковую» фильтрацию строк с помощью 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>

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

1 Ответ

15 голосов
/ 23 апреля 2009

См. Задачу 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"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...