sed中未终止的`s'命令[重复]

Posted

技术标签:

【中文标题】sed中未终止的`s\'命令[重复]【英文标题】:unterminated `s' command in sed [duplicate]sed中未终止的`s'命令[重复] 【发布时间】:2018-05-29 17:50:06 【问题描述】:

在一个简单的 bash 脚本中使用下面的命令来获取 mysql 5.7 中的临时密码。

vzctl exec $VEID 'defaultpass=$(cat /var/log/mysqld.log | grep "A temporary password is generated for" | tail -1 | sed -n 's/.*root@localhost: //p')'

但是,当我运行命令进行测试时,它会显示以下内容:

sed: -e expression #1, char 19: unterminated `s' command

谁能解释一下我到底做错了什么。我绝不是专家,但我认为这是正确的。我也尝试用“替换',但这没有用。没有错误,但$defaultpass返回空。

跟进:不幸的是,当我使用双引号时,如 pii_ke 所述,变量的输出为空/空白。所以这是行不通的。也许这里还有其他问题?

【问题讨论】:

不确定到底是哪个字符导致了这种情况,但如果你不想引用正则表达式字符,你必须使用sed -E 为什么不分成多个命令而不是单个复杂的命令?并且不需要在那里使用cat .. 只需执行grep 'string' filename 【参考方案1】:

因为vzctl 命令的整个第三个参数是用单引号引起来的。您应该将 sed 命令放在双引号内:

vzctl exec $VEID 'defaultpass=$(cat /var/log/mysqld.log | grep "A temporary password is generated for" | tail -1 | sed -n "s/.*root@localhost: //p")'

【讨论】:

没关系,我错了。当我调用变量 defaultpass 时,输出为空。这就是我的意思是我已经用双引号试过了。起初我认为它有效,但我之前已经使用过这个变量(所以它仍然记得那个输入)。所以,如果我用你的例子;带双引号,我称变量为空白/空...? 试试defaultpass=$(vzctl exec $VEID '…')。然后它将在当前范围内设置defaultpass

以上是关于sed中未终止的`s'命令[重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式(C#)中未终止的[]集[重复]

替换选项:sed 命令中的 s [重复]

sed中没有未命令的's'命令[重复]

通过 ssh 连接的 sed + `s' 的未知选项 [重复]

sed 错误:sed:-e 表达式 #1,字符 22:未终止的 `s' 命令

运行命令 **sed** 时出现 docker 容器错误 [重复]