2011-02-05 90 views

回答

2

最简单的方式实现这一目标用“传统”的工具是sed

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

而如果是基于Ant那么这应该帮助:http://ant.apache.org/manual/Tasks/replace.html

最简单的形式是<replace file="myfile.html" token="OLD" value="NEW"/>

如果你真的需要它,你可以运行的外部工具与蚂蚁作为http://ant.apache.org/manual/Tasks/exec.html解释说,这意味着,除其他事项外,你可以打电话从蚂蚁的sed的东西,如:

<exec executable="sed"> 
    <arg value="s/old/new/g" /> 
    <arg value="$MY_FILE" /> 
</exec> 
+0

PHING是一个基于Apache Ant的PHP项目构建系统或构建工具。你可以用它做任何事情,你可以用像GNU make这样的传统构建系统来做什么,它使用简单的XML构建文件和可扩展的PHP“任务”类使它成为一个易于使用和高度灵活的构建框架。 – milan 2011-02-05 16:41:41

+0

http:// phing。info/ – milan 2011-02-05 16:42:41

+0

我试过替换标签,但得到`不能创建任务/类型:'替换'。确保已经使用taskdef/typedef声明了此类。 – 2016-03-15 08:11:11

25

您可以替换文本内部文件使用过滤器。过滤器用于其他文件操作任务,例如复制。

我相信过滤器背后的主要思想是您可以使用标记而不是实际值创建模板文件,然后将标记替换为复制过程的一部分。

快速示例:将数据库配置模板文件存储在模板目录中。然后,你把它复制到使用目标配置文件:

<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

+0

这应该是答案。 – 2015-01-02 08:49:52

7

我一直在寻找同样的事情,而且我发现,存在一个名为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> 

这样你不明确的列出所有需要更换的令牌,漂亮有用...

+0

我用你的过滤器链,但与上面的人的反身任务。 – thescientist 2014-03-10 01:50:21

27

如果你不想复制文件和文件只需更换在你的文件驻留在当前文件夹的字符串,做一个reflexive task

<reflexive> 
    <fileset dir="."> 
     <include pattern="*.js" /> 
    </fileset> 
    <filterchain> 
     <replaceregexp> 
      <regexp pattern="SEARCH" replace="REPLACEMENT"/> 
     </replaceregexp> 
    </filterchain> 
</reflexive> 
+1

谢谢!这个答案确实是最好的选择,尽管其他人在这一点上有更多的选票。这个任务应该如何完成,而不需要不必要的复制,并且在原生phing任务可用时使用exec任务。 – AlexG 2013-12-20 18:26:06

2

我用这对我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}" /> 
-1

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> 

这对我很好。