如何通过ssh命令在sed中转义$?

时间:2013-07-10 18:05:53

标签: ssh sed escaping dollar-sign

我正在尝试创建一个补丁,用户可以使用sed以预定义的方式远程编辑文件,我可以在每台计算机上手动执行此操作,但这需要很长时间。

我正在努力的路线如下:

host=[hostname]
port=[portnum]
ssh -t $host -p $port "cp ~/file1 ~/file1.bak ; sed -i \"s/fcn1('param1', $2)\n/fcn2('param2'):$zoom\n/g\" ~/file1"

这会备份file1,然后在文件中编辑一行。我实际上想要编辑多行,但这一行演示了以下问题: 如果在sed命令中没有使用$符号,则命令有效。

我已尝试过多种逃避这些$符号的方法,但似乎找不到有效的方法。 我可以用一个。发现中的通配符,但显然不在替换字符串中。

我会为sed命令使用单引号,以避免扩展$ 2,但是在命令中已经使用了单引号。

有没有人对如何克服这个问题有任何想法?提前感谢任何建议!

1 个答案:

答案 0 :(得分:3)

这也应该有效:

ssh -t $host -p $port "cp ~/file1 ~/file1.bak && sed -i \"s/fcn1('param1', \\\$2)/fcn2('param2'):\\\$zoom/g\" file1"

你需要3个反斜杠,因为你必须将远程bash中传递的字符串中的$符号转义为sed。当你通过ssh发送它时,你必须逃避反斜杠和$符号。