在sed的替换字符串中使用文件的内容

时间:2017-03-02 19:10:08

标签: bash replace sed

我花了几个小时搜索,找不到解决方法。我有一个包含超过1,000个PHP文件的目录。我需要更换这些文件中的一些代码,如下所示:

查找

var ulWidth = 0;
$j(function() {
    ulWidth = ulWidth + $j('ul.product-selection > li').width();
    $j('ul.product-selection > li > ul').css({'left': ulWidth});
});

替换为(保存在replacement.txt:

session_register("CurWebsiteID");

使用下面的命令,我可以用 $(cat replacement.txt)替换模式,而我正在寻找用文本文件的内容替换它们。

正在使用的命令:

if(!function_exists ("session_register") && isset($_SERVER["DOCUMENT_ROOT"])){require_once($_SERVER["DOCUMENT_ROOT"]."/libraries/phpruntime/php_legacy_session_functions.php");} session_register("CurWebsiteID");

我还尝试使用变量代替find . -name "*.xml" | xargs -n 1 sed -i -e 's/mercy/$(cat replacement.txt)/g'并使用replacement=code_above;运行调整后的版本,但这也无济于事。

实现这一目标的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

这里不需要命令替换。您可以使用sed d命令插入文件内容,使用find . -name "*.xml" | xargs -n 1 sed -i -e '/mercy/r replacement.txt' -e '//d' 删除与模式匹配的行:

setInterval

答案 1 :(得分:2)

$(...)不会在单引号内解释。使用双引号:

find . -name "*.xml" | xargs -n 1 sed -i -e "s/mercy/$(cat replacement.txt)/g"

您也可以取消cat

find . -name "*.xml" | xargs -n 1 sed -i -e "s/mercy/$(< replacement.txt)/g"

如果replacement.txt中包含/,请在sed表达式中使用不同的分隔符,例如@

find . -name "*.xml" | xargs -n 1 sed -i -e "s@mercy@$(< replacement.txt)@g"

另见: