sed失败,并带有“;`s';的未知选项&引用;错误

sed失败,并带有“;`s';的未知选项&引用;错误,sed,Sed,我想用 sed -i -e "s/.*seb.*/ \"$ftp_login_template\"/" $ftp_dir 但是我得到了这个错误: sed: -e expression #1, char 34: unknown option to `s' 我不明白为什么,因为这是完美的: sed -i -e "s/.*wbspassword.*/ \"wbspassword\": \"$password\",/" $user_conf 你知道我做错了什么吗 这可能是问题所在吗?

我想用

sed -i -e "s/.*seb.*/    \"$ftp_login_template\"/" $ftp_dir
但是我得到了这个错误:

sed: -e expression #1, char 34: unknown option to `s'
我不明白为什么,因为这是完美的:

sed -i -e "s/.*wbspassword.*/    \"wbspassword\": \"$password\",/" $user_conf
你知道我做错了什么吗

这可能是问题所在吗?
ftp\u login\u template=\${user}:${password}:24:86:\/var\/lib\/clit.${user}\/downloads:\/bin\/false\“

问题在于斜杠:变量包含斜杠,最后的命令类似于
sed“s/string/path/to/something”
,包含太多斜杠

由于
sed
可以使用任何字符作为分隔符(无需声明新的分隔符),因此您可以尝试使用替换字符串中未出现的另一个分隔符:

replacement="/my/path"
sed --expression "s@pattern@$replacement@"

请注意,这不是防弹的:如果替换字符串稍后包含
@
,它将因相同的原因中断,任何像
\1
这样的反斜杠序列仍将根据
sed
规则进行解释。使用
作为分隔符也是一个不错的选择,因为它在可读性方面与
//code>类似.

这只是一个帮助未来用户的注意事项,因为我发现这个答案也很有帮助。原始海报很可能在其替换内容中有包含正向斜杠的内容(很可能隐藏在变量中)。在遇到第一个斜杠后,sed认为替换内容已终止,接下来的任何内容都是一个选项(例如
g
)。做得很好(请记住用
而不是
包装变量表达式,否则在最终结果中会得到大量
$content
而不是
$content
:)的内容)@抽象不和谐如果你正在替换密码或其他奇怪的或随机的东西,你仍然有@在里面。您必须找到一个不包含在替换字符串中的分隔符。@ppumkin只需将“正斜杠”分隔符替换为不同的字符,例如:
sed-i“s/。/../g”
s@...@…@g“
,那么多个斜杠的问题应该消失了。如果您使用
而不是
它也应该可以很好地处理内部变量,即:
export var1=bar;sed-i”s@foo@${var1}@g“
。您可以在awesome sed文档中找到更多信息:请参阅
info sed
(源代码:):“s(如替换)命令的语法为's/regexp/replacement/flags'。在任何给定的s命令中,/字符可以统一替换为任何其他单个字符。“BSD错误消息(包括OSX)是“替换命令中的错误标志:”--在此处包含它是为了使其更易于使用。重复的