我正在尝试替换远程服务器上文件中的字符串:
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
此处文档的开头关键字被引用,这意味着整个此处文档是单引号的。更容易阅读,不是吗?