найти заменить текст в файле с помощью Phing

Кто-нибудь знает, как найти и заменить текст внутри файла с помощью Phing?


person milan    schedule 05.02.2011    source источник


Ответы (6)


Самый простой способ добиться этого с помощью «традиционных» инструментов — это sed:

sed -i 's/old/new/g'  myfile.txt

И если он основан на муравье, то это должно помочь: http://ant.apache.org/manual/Tasks/replace.html

Простейшей формой будет <replace file="myfile.html" token="OLD" value="NEW"/>.

И если вам это действительно нужно, вы можете запускать внешние инструменты с ant, как описано на http://ant.apache.org/manual/Tasks/exec.html, что означает, что среди прочего вы можете, например, вызвать sed из ant с помощью чего-то вроде:

 <exec executable="sed">
   <arg value="s/old/new/g" />
   <arg value="$MY_FILE" />
 </exec>
person ccpizza    schedule 05.02.2011
comment
PHing — это система сборки проекта PHP или инструмент сборки на основе Apache Ant. Вы можете делать с ним все, что вы могли бы делать с традиционной системой сборки, такой как GNU make, а использование в ней простых файлов сборки XML и расширяемых классов задач PHP делает ее простой в использовании и очень гибкой средой сборки. - person milan; 05.02.2011
comment
Я попробовал заменить тег, но получил Could not create task/type: 'replace'. Make sure that this class has been declared using taskdef / typedef. - person Sandeepan Nath; 15.03.2016

Если вы не хотите копировать файлы и просто заменяете строку в текущей папке, где находятся ваши файлы, выполните рефлексивная задача:

<reflexive>
    <fileset dir=".">
        <include pattern="*.js" />
    </fileset>
    <filterchain>
        <replaceregexp>
            <regexp pattern="SEARCH" replace="REPLACEMENT"/>
        </replaceregexp>
    </filterchain>
</reflexive>
person acme    schedule 08.11.2011
comment
Спасибо! Этот ответ действительно лучший вариант, хотя у других на данный момент больше голосов. Таким образом, задача должна выполняться без ненужного копирования и использования задачи exec, когда доступна собственная задача phing. - person AlexG; 20.12.2013
comment
Согласен с предыдущим комментарием. Это ответ, за который следует проголосовать максимум, поскольку он фактически отвечает на вопрос, все остальные - обходные пути. - person van; 27.05.2016

Вы можете заменить текст внутри файлов с помощью фильтров. Фильтры используются внутри других задач операций с файлами, таких как копирование.

Я считаю, что основная идея фильтров заключается в том, что у вас могут быть файлы шаблонов с токенами вместо реальных значений, а затем вы подставляете токены как часть процесса копирования.

Краткий пример: храните файл шаблона конфигурации базы данных в каталоге шаблонов. Затем вы копируете его в целевой файл конфигурации, используя:

<copy file="templates/database.config.php.tpl" tofile="config/database.config.php" overwrite="true">
                <filterchain>
                    <replacetokens begintoken="%%" endtoken="%%">
                        <!-- MySQL TOKENS -->
                        <token key="dbname" value="${db.mysql.dbname}" />
                        <token key="dbhost" value="${db.mysql.host}" />
                        <token key="dbport" value="${db.mysql.port}" />
                        <token key="dbuser" value="${db.mysql.username}" />
                        <token key="dbpassword" value="${db.mysql.password}" />
                    </replacetokens>
                </filterchain>
            </copy>

Существует множество других доступных фильтров (например, поиск и замена регулярных выражений). Подробнее о фильтрах см. в документации: http://phing.info/docs/guide/stable/chapters/appendixes/AppendixD2-CoreFilters.html

person poisson    schedule 06.02.2011
comment
Это должен быть ответ. - person Eric MORAND; 02.01.2015

Я искал то же самое и обнаружил, что существует фильтр с именем ExpandProperties, который позволяет заменить свойства в скопированном файле. Например, я использовал его в шаблоне виртуального хоста Apache:

<target name="apache-config" description="Generates apache configuration">
    <!-- Default value for Debian/Ubuntu -->
    <property name="apache.vhost.dir" value="/etc/apache2/sites-available" override="false"/>
    <copy file="${application.startdir}/docs/vhost.conf.tpl" todir="${apache.vhost.dir}" overwrite="true">
        <filterchain>
            <expandproperties/>
        </filterchain>
    </copy>
    <echo message="Apache virtual host configuration copied, reload apache to activate it"/>
</target>

И в файле шаблона

<VirtualHost *:80>
   DocumentRoot "${application.startdir}/public"
   ServerName ${apache.default.host}

   <Directory "${application.startdir}/public">
       Options Indexes MultiViews FollowSymLinks
       AllowOverride All
       Order allow,deny
       Allow from all
   </Directory>

</VirtualHost>

Таким образом, вам не нужно явно перечислять все токены, которые вы хотите заменить, что довольно полезно...

person Fabio    schedule 19.07.2011
comment
Я использовал вашу цепочку фильтров, но с рефлексивными задачами вышеупомянутого человека. - person thescientist; 10.03.2014

Я использую это в своем файле phing build.xml.

<exec command="find ./ -type f -name '*.php' | xargs sed -i 's|x--Jversion--x|${jversion}|g'" dir="${targetdir}/_package/${extname}.${package.version}" /> 
person Francesco Scrooge Mulassano    schedule 29.03.2012
comment
x--Jversion--x — это заполнитель ${jversion} — это новый текст. - person Francesco Scrooge Mulassano; 29.03.2012

Ответ, данный Acme, является правильным. Если вы пытаетесь скопировать файл в себя, чтобы изменить его, вопит, говоря, что вы не можете копировать себя.

<reflexive file="./app/config/config.yml" tofile="./app/config/config.yml">
    <filterchain>
    <replacetokens begintoken="__" endtoken="__">
        <token key="BUILD_VERSION" value="Replace Value" />
    </replacetokens>
    </filterchain>
</reflexive>

Это хорошо работает для меня.

person Ruben Ajras    schedule 19.01.2017
comment
Если в вашем примере вам понадобится только: ‹reflexive file=./app/config/config.yml › - person CoalaWeb; 24.10.2017