0

我需要更新一个正在移动到新主机的网站。我想在每个文件中添加以下行,只有一次,在第一次出现之后<?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但如果解决方案确实考虑到了这一点,那么这对我也有好处。


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; }'
4

3 回答 3

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; }'
于 2012-08-11T11:51:57.777 回答
1

试试这个:

find . -name "*" -print0 | xargs -0 sed '0,/<?php/s/<?php/<?php\n\tdefine(...)/'
于 2012-08-11T11:56:35.280 回答
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 f用于find过滤目录的开关。

于 2012-08-11T11:58:24.330 回答