在远程 ssh 服务器上强制变量扩展

在远程 ssh 服务器上强制变量扩展

我正在尝试替换远程服务器上文件中的字符串:

ssh $login "
replacement=\`find . -name file\`;
sed -i -e 's/contact/\$replacement/g' path/file;
"

但我无法获取 sed 使用的 $replacement 变量的内容。上面的例子打印$replacement在我的文件中。我也尝试过

sed -i -e 's/contact/\"\$replacement\"/g' path/file;

但它只是打印"$replacement"

正确的语法是什么?

答案1

问题是在单引号之间 $replacement 没有扩展。

在这种情况下sed -i -e "s/contact/$replacement/g" path/file;应该有效。

或这个:

sed -i -e 's/nothing/'$replacement'/g' path/file;

例子:

$ echo "There's nothing there." > file 
$ cat file 
There's nothing there.
$ replacement=something 
$ sed -i -e 's/nothing/'$replacement'/g' file;
$ cat file
There's something there.

回应下面 Kusalananda 的评论:如果替换(作为路径)包含斜杠,那么您必须在将其与 sed 一起使用之前对其进行预处理:

replacement=$(sed 's@\/@\\\/@g' <<< "$replacement")

答案2

当你在引用地狱时,探索这里的文档是一个好主意:

ssh "$login" <<'END_REMOTE'
    replacement=$(find . -name file)
    sed -i -e 's/contact/$replacement/g' path/file
END_REMOTE

此处文档的开头关键字被引用,这意味着整个此处文档是单引号的。更容易阅读,不是吗?

相关内容