代码之家  ›  专栏  ›  技术社区  ›  dotancohen schneck

在第一个<?之后添加一行代码?php行

  •  0
  • dotancohen schneck  · 技术社区  · 13 年前

    我需要更新一个正在迁移到新主机的网站。我想在第一次出现 <?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 回复  |  直到 13 年前
        1
  •  2
  •   cdtits    13 年前
    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; }'
    
        2
  •  1
  •   mrucci Bernhard Zürn    13 年前

    您可以直接使用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 用于筛选出目录。

        3
  •  1
  •   aefxx    13 年前

    试试这个:

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