【问题标题】:Sed Command (unterminated 's' command)Sed 命令(未终止的 's' 命令)
【发布时间】:2019-06-26 09:03:06
【问题描述】:

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

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

【问题讨论】:

  • 我无法重现该错误。这真的是您正在运行的命令,还是您将变量替换为 s/// 命令?
  • 一些想法:尝试'' 而不是"",或尝试\\ 1111(双反斜杠)。我不在终端,但这对我来说似乎是一个可能的报价问题。祝你好运!
  • 您是直接执行命令,还是先尝试将其存储在变量中?见BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!
  • -i 选项的处理方式取决于 sed 的版本 (sed --version)。有些版本需要-i 有一个参数,所以请尝试使用-i ''
  • 而不是-i选项,总是有老式的方式:sed "s/batch_start.*/batch_start\ 1111/" /tmp/runfile > tmpfile && mv tmpfile /tmp/runfile

标签: bash sed


【解决方案1】:

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

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

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

这种类型有两层引号,但引号不嵌套,所以它不起作用。本地 shell 将其解析为双引号字符串 "sudo sed -i ",然后是不带引号的部分 s/batch_start.*/batch_start\ 1111/(其中包含转义空格,因此它将删除转义),然后是另一个双引号部分:" /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

...这就是远程 shell 将执行的命令。由于s/batch_start.*/batch_start1111/ 之间有一个空格,它们作为单独的参数传递给sed,它将第一个作为要执行的命令(缺少关闭/),第二个作为文件名.

解决方案:有很多方法可以更正引用。您可以使用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

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

【讨论】:

  • 非常感谢。这真的很有帮助。
猜你喜欢
  • 2016-07-29
  • 2019-05-04
  • 2013-06-11
  • 2012-05-05
  • 2012-07-10
  • 2013-11-27
  • 2018-05-29
  • 1970-01-01
  • 2015-09-25
相关资源
最近更新 更多