2013-07-10 215 views
3

我想创建一个补丁,用户可以使用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" 

这使得文件1的备份,然后编辑该文件在一条线上。我实际上想要编辑多行,但是这一行演示了这些问题: 如果在sed命令中没有使用$符号,则该命令有效。

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

我会为sed命令使用单引号,以避免扩展$ 2,但单引号已在命令内部使用。

有没有人有任何想法如何克服这个问题?在此先感谢您的任何建议!

+2

您需要转义为在字符串上完成的每个解析运行。我在考虑至少2次运行:一次用于本地shell,另一次用于远程shell,所以你至少需要'\\ $ 2',并且可能需要'\\\\ $ 2'。 –

+0

@Marc B谢谢,这是我的第一个想法,但我发现[链接] http://stackoverflow.com/questions/7990750/escape-single-quote使用\\\ $ 2。我尝试从0-4反斜杠,但最终决定使用。第一个$的通配符可以简化问题并专注于第二个$,但仍然不能用第二个字符串中的$替换,我尝试使用多达四个反斜杠进行转义:1或3返回错误“zoom:Undefined variable”;假定$ zoom是空的,0或2实现sed, 4在空的$ zoom之前产生一个反斜杠。我甚至尝试用最多四个斜线定义$ zoom ='$ zoom',但没有成功。 – user1814618

+0

我找到了解决方案 - 暂时撤回一个shell来植入$字符; 即用[\“\\ $ \”zoom]替换[$ zoom] 这也适用于第一个示例,所以我不需要通配符。 – user1814618

回答

3

这应该工作以及:

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

需要3回斜线,你必须逃离远程庆典传递给sed字符串中的$符号。当你通过ssh发送它时,你必须逃避反斜杠和$符号。