【问题标题】:Using sed to replace variable name and its value使用 sed 替换变量名及其值
【发布时间】:2017-01-10 14:18:02
【问题描述】:

在许多 PHP 文件中,我已经像这样定义了变量 $_PATHROOT

$_PATHROOT = '../../../../';

我会用define()替换它:

define('_PATHROOT', '../../../../');

当然,值 ../../../../ 因文件而异。

是否可以使用 linux sed 命令行?

谢谢。

【问题讨论】:

    标签: replace sed


    【解决方案1】:

    绝对有可能。

    以下命令适用于任何脚本(它适用于我的测试文件):

    sed -ri "s/^[$]_PATHROOT = '(([.][.]\/)+)';$/define('_PATHROOT', '\1');/" FILEPATH

    您将 FILEPATH 替换为要编辑的文件的路径。

    此命令假定您要更改的行正是

    $_PATHROOT = '../../';

    除了可能有任何正数的“../”。空格的任何变化都会将其丢弃,因此如果文件之间存在差异,则需要对其进行修改。

    感谢 Kent 使用 [$] 而不是一堆反斜杠的想法,因为 $ 在 bash 和 sed 中都有特殊含义。

    【讨论】:

      【解决方案2】:

      这个 sed 单行适用于给定的示例:

      sed -r "s/^[$](\w+)(.*);/define('\1'\2);/;s/=/,/"
      

      kent$  sed -r "s/^[$](\w+)(.*);/define('\1'\2);/;s/=/,/"<<<"\$_PATHROOT = '../../../../';"  
      define('_PATHROOT' , '../../../../');
      

      【讨论】:

      • 是的,但是值可能会改变,例如'../../',我想在查找命令find -type f -name "*.php" -exec sed -i ... 中执行 sed 命令。有可能吗?
      • 我想 PHP 文件也将包含其他行。考虑到 PHP 中有多少行以 $ 开头,这种模式不会影响其他不相关的行吗?
      • 这取决于文件,它们以$开头的行数不同。
      • 我没有硬编码值部分,所以它也应该适用于其他值。 @伦敦史密斯
      猜你喜欢
      • 2018-07-28
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      相关资源
      最近更新 更多