在第一个<! - ?php line - >之后添加一行代码

时间:2012-08-11 11:33:55

标签: php linux perl

我需要更新正在迁移到新主机的网站。我想在第一次出现<?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之后的额外代码的情况,但是如果解决方案确实考虑到这一点,那么这对我来说也是有益的。

3 个答案:

答案 0 :(得分: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 :(得分:1)

试试这个:

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

答案 2 :(得分: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替换为自身,后跟带有新文本的新行。
  3. 请注意,我已将开关-type f添加到find以过滤掉目录。