Bash Sed命令(未终止的“s”命令)

Bash Sed命令(未终止的“s”命令),bash,sed,Bash,Sed,我正在尝试向标志batch start添加一个参数。这就是它给我的错误。你知道怎么解决这个问题吗 $ sed -i "s/batch_start.*/batch_start\ 1111/" /tmp/runfile sed: -e expression #1, char 27: unterminated `s' command 根本问题是命令是通过ssh发送的;这意味着它将通过两个级别的shell解析运行,一个在本地计算机上,另一个在远程计算机上。这意味着它要经过两次引号/转义解析、应用程序和

我正在尝试向标志batch start添加一个参数。这就是它给我的错误。你知道怎么解决这个问题吗

$ sed -i "s/batch_start.*/batch_start\ 1111/" /tmp/runfile
sed: -e expression #1, char 27: unterminated `s' command

根本问题是命令是通过ssh发送的;这意味着它将通过两个级别的shell解析运行,一个在本地计算机上,另一个在远程计算机上。这意味着它要经过两次引号/转义解析、应用程序和删除,因此需要两层引号/转义

最后一条注释中的命令不会解析不匹配的引号,但我可以使用此命令再现错误消息:

ssh remoteHost "sudo sed -i "s/batch_start.*/batch_start\ 1111/" /tmp/runfile"
这种类型有两个级别的引号,但引号不嵌套,因此不起作用。本地shell将其解析为一个双引号字符串sudo sed-i,然后是一个不带引号的节s/batch\u start.*/batch\u start\1111/,其中包含一个转义空间,因此它将删除转义,然后删除另一个双引号节:/tmp/runfile。因为它们之间没有空格,所以它们都作为单个参数传递给ssh。通过将ssh remoteHost替换为echo,可以看到解析后字符串:

…这就是远程shell将执行的命令。由于在s/batch_start.*/batch_start和1111/之间有一个空格,它们作为单独的参数传递给sed,sed将第一个视为要执行的命令,该命令缺少close/而第二个视为文件名

解决方案:有很多方法可以更正报价。您可以使用echo技巧查看将发送到远程shell的内容。我倾向于在整个命令周围使用单引号,然后只要内部命令本身不包含单引号,就在命令内部使用单引号。在这种情况下,这意味着:

ssh remoteHost 'sudo sed -i "s/batch_start.*/batch_start 1111/" /tmp/runfile'
它在远程计算机上执行此操作:

sudo sed -i "s/batch_start.*/batch_start 1111/" /tmp/runfile

请注意,我删除了空格上的转义。

我无法重现错误。这真的是您正在运行的命令吗,或者您正在将变量替换到s///命令中?一些想法:尝试替换,或者尝试\\1111将反斜杠加倍。我不在终点站,但对我来说,这似乎是一个可能的引用问题。祝你好运您是直接执行命令,还是先尝试将其存储在变量中?查看如何处理-i选项取决于sed的版本sed-version。有些版本要求-i有一个参数,所以请尝试使用-i。除了-i选项,还有一种老式的方法:sed s/batch_start.*/batch_start\1111//tmp/runfile>tmpfile&&mv tmpfile/tmp/runfile非常感谢。这真的很有帮助。
sudo sed -i "s/batch_start.*/batch_start 1111/" /tmp/runfile