find 和 sed 没有替换文件内容

find 和 sed 没有替换文件内容

我尝试使用find -type f -name "*.php" -exec sed -i.bak 's|"$_SERVER[\"DOCUMENT_ROOT\"]./|$_SERVER[\"DOCUMENT_ROOT\"]."/|gI' {} \;替换

<?php
include("$_SERVER["DOCUMENT_ROOT"]./info/benth_nav_top.php");
include_once("$_SERVER["DOCUMENT_ROOT"]./analyticstracking.php");
?>

<?php
include($_SERVER["DOCUMENT_ROOT"]."/info/benth_nav_top.php");
include_once($_SERVER["DOCUMENT_ROOT"]."/analyticstracking.php");
?>

不幸的是,它并没有取代任何东西。

我错过了什么?

先感谢您

答案1

您想将双引号从之前移动$_SERVER["DOCUMENT_ROOT"].到之后。

sed在单个文件中执行此操作的命令:

sed 's/"\(\$_SERVER\["DOCUMENT_ROOT"\]\.\)/\1"/' file.php

、和在模式中很特殊$,必须转义(这是代码中的主要问题)。上面的表达式捕获了我们想要保持不变的字符串部分,并将其替换为相同的字符串,但随后插入了一个。[]."

添加gs/.../.../对每行上所有出现的模式进行更改。

.php要对当前目录中或当前目录下的所有文件运行此命令:

find . -type f -name '*.php' \
    -exec sed -i.bak 's/"\(\$_SERVER\["DOCUMENT_ROOT"\]\.\)/\1"/' {} ';'

相关内容