我需要更新正在迁移到新主机的网站。我想在第一次出现<?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
之后的额外代码的情况,但是如果解决方案确实考虑到这一点,那么这对我来说也是有益的。
答案 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|'
您要指定的地方:
0,/<?php
:从第一行到第一次出现<?php
s||&\nNEW_TEXT|
:您将上一个匹配<?php
替换为自身,后跟带有新文本的新行。请注意,我已将开关-type f
添加到find
以过滤掉目录。