【发布时间】:2017-01-10 14:18:02
【问题描述】:
在许多 PHP 文件中,我已经像这样定义了变量 $_PATHROOT
$_PATHROOT = '../../../../';
我会用define()替换它:
define('_PATHROOT', '../../../../');
当然,值 ../../../../ 因文件而异。
是否可以使用 linux sed 命令行?
谢谢。
【问题讨论】:
在许多 PHP 文件中,我已经像这样定义了变量 $_PATHROOT
$_PATHROOT = '../../../../';
我会用define()替换它:
define('_PATHROOT', '../../../../');
当然,值 ../../../../ 因文件而异。
是否可以使用 linux sed 命令行?
谢谢。
【问题讨论】:
绝对有可能。
以下命令适用于任何脚本(它适用于我的测试文件):
sed -ri "s/^[$]_PATHROOT = '(([.][.]\/)+)';$/define('_PATHROOT', '\1');/" FILEPATH
您将 FILEPATH 替换为要编辑的文件的路径。
此命令假定您要更改的行正是
$_PATHROOT = '../../';
除了可能有任何正数的“../”。空格的任何变化都会将其丢弃,因此如果文件之间存在差异,则需要对其进行修改。
感谢 Kent 使用 [$] 而不是一堆反斜杠的想法,因为 $ 在 bash 和 sed 中都有特殊含义。
【讨论】:
这个 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 命令。有可能吗?
$ 开头,这种模式不会影响其他不相关的行吗?
$开头的行数不同。