2012-08-11 75 views
0

我需要更新移動到新主機的網站。我想下面的行添加到每個文件中,只有一次,<?php第一次出現後:在第一個<?php行後面添加一行代碼

define('FRAMEWORK_LOCATION', '/home/someUser/framework.php'); 

我曾經嘗試這樣做的Perl oneliner的幾個變化:

$ find . -name '*' -print0 | xargs -0 perl -pi -e 's|<?php|<?php\rdefine('\''FRAMEWORK_LOCATION'\'', '/home/someUser/framework.php');' 

然而,如被看到會影響所有線路。在初始<?php之後,我並不特別擔心其他代碼的情況,儘管如果解決方案確實考慮到了這一點,那麼這對我也有好處。

+4

建議:您可能希望將define()放在config.php中,然後將該文件包含在其他文件中。這樣你可以在未來獲得靈活性。 – HappyTimeGopher 2012-08-11 11:37:10

+0

@HappyTimeGopher:不,我不會獲得更多的靈活性,因爲我仍然需要更新包含()config.php文件的行。如果任何一行發生更改,則更新現有行是一個更簡單的Perl腳本。 – dotancohen 2012-08-11 11:46:31

+2

@dotancohen不開心是對的。下次您需要更改FRAMEWORK_LOCATION時,您只需在一個位置而不是每個文件中執行此操作。 – vascowhite 2012-08-11 11:49:42

回答

1

您可以直接使用SED,而無需調用的Perl:

$ find . -name '*' -type f -print0 | xargs -0 sed -e '0,/<?php/s||&\ndefine("FRAMEWORK_LOCATION","/home/someUser/framework.php")|' 

相關位是:

sed -e '0,/<?php/s||&\nNEW_TEXT|' 

在要指定:

  1. 範圍0,/<?php:從第一行到<?php
  2. 取代s||&\nNEW_TEXT|第一次出現:其中可以使用本身代替以前的匹配<?php後跟一個帶有一些新文本的新行。

請注意,我添加了開關-type ffind用於過濾出目錄。

+0

謝謝!我不得不做出一些改變,但是這一線是最接近我的最終目標。 – dotancohen 2012-09-06 03:48:12

+0

對於發生在這篇文章中的google的人:'find。 -name \ *。php -type f -print0 | xargs -0 sed -i'0,/ <?php/s || <?php \ ndefine(「FRAMEWORK_LOCATION」,「/ home/someUser/framework.php」); \ n |'' – dotancohen 2012-09-06 04:11:13

2
perl -ie 'undef $/; $txt = <>; $txt =~ s|<?php|<?php\rdefine("FRAMEWORK_LOCATION", "/home/someUser/framework.php")|; print $txt;' 

perl -ie '$first = 1; while (<>) { if ($first && s|<?php|<?php\rdefine("FRAMEWORK_LOCATION", "/home/someUser/framework.php")|) { $first= 0; } print; }' 
1

試試這個:

find . -name "*" -print0 | xargs -0 sed '0,/<?php/s/<?php/<?php\n\tdefine(...)/'