2011-02-05 88 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> 

這對我很好。