Sed命令(以's'结尾的命令)

时间:2019-06-25 01:41:46

标签: bash sed

我正在尝试将参数添加到标志批处理开始。这是它给我的错误。关于如何解决此问题的任何想法?

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

1 个答案:

答案 0 :(得分:0)

根本问题是命令是通过ssh发送的;这意味着它正在经历两个层次的外壳解析,一个层次是在本地计算机上,然后是另一层次在远程计算机上。这意味着它需要两次执行引号/转义解析,应用程序和删除操作,因此您需要两个“层”来进行引号/转义。

最后一条注释中的命令无法解析(引号不匹配),但是我可以使用以下命令重现错误消息:

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

这种排序有两个级别的引号,但是引号不会嵌套,因此不起作用。本地外壳程序将其解析为双引号字符串"sudo sed -i ",然后是未引用的节s/batch_start.*/batch_start\ 1111/(其中包含转义的空格,因此它将删除转义符),然后是另一个双引号的节:{ {1}}。由于它们之间没有空格,它们都作为单个参数传递给" /tmp/runfile"。通过将ssh替换为ssh remoteHost,可以看到解析后的字符串:

echo

...这就是远程外壳程序将执行的命令。由于$ echo "sudo sed -i "s/batch_start.*/batch_start\ 1111/" /tmp/runfile" sudo sed -i s/batch_start.*/batch_start 1111/ /tmp/runfile s/batch_start.*/batch_start之间有一个空格,它们作为单独的参数传递给1111/,并且将第一个视为要执行的命令(缺少闭合的{{1} }),第二个作为文件名。

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

/

在远程计算机上执行此操作

echo

(请注意,我删除了空间上的转义符。)