sed 失败,出现“'s' 的未知选项”错误 [关闭]

Posted

技术标签:

【中文标题】sed 失败,出现“\'s\' 的未知选项”错误 [关闭]【英文标题】:sed fails with "unknown option to `s'" error [closed]sed 失败,出现“'s' 的未知选项”错误 [关闭] 【发布时间】:2012-03-11 03:06:09 【问题描述】:

我正在尝试使用

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_login_template=\$user:$password:24:86::\/var\/lib\/clit.$user\/downloads:\/bin\/false\"

【问题讨论】:

*BSD 错误消息(包括 OSX)是“替代命令中的错误标志:”——将其包含在此处以使其更易于搜索。 重复***.com/questions/27787536/… 【参考方案1】:

问题在于斜杠:您的变量包含它们,最终命令将类似于sed "s/string/path/to/something/g",其中包含太多斜杠。

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

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

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

【讨论】:

只是一个帮助未来用户的注释,因为我发现这个答案也很有帮助。最初的海报很可能在他的替代品中有一些东西(很可能隐藏在变量中),其中包含正斜杠。在遇到第一个斜杠后,sed 认为替换已终止,并且可以选择接下来出现的任何内容(例如 g)。 干得好(记得用" 而不是' 包装变量表达式,否则你会在最终结果中得到很多$content 而不是$content 的内容:) ) @AbstractDissonance 也许如果您要替换密码或一些奇怪或随机的东西,您仍然有@。您必须找到一个不包含在您的替换字符串中的分隔符。 @ppumkin 只需将“正斜杠”分隔符如:sed -i "s/../../g" 替换为不同的字符,即:sed -i "s@...@...@g",那么多个斜杠的问题应该会消失。如果您使用" 而不是',它也应该适用于内部变量,即:export var1=bar; sed -i "s@foo@$var1@g"。更多信息你可以在很棒的 sed 文档中找到:grymoire.com/Unix/Sed.html 参见info sed(来源:unix.stackexchange.com/questions/259083/…):“s(作为替代)命令的语法是's/regexp/replacement/flags'。/ 字符可以被任何给定的 s 命令中的任何其他单个字符统一替换。”

以上是关于sed 失败,出现“'s' 的未知选项”错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何用 sed 的变量替换单引号字符串? [复制]

构建失败并出现错误错误代码 72 命令:xcrun

sed 在 MacOS 上的“未定义标签”

sed -i 选项有啥作用?

如何使用sed与模式文件和sed到位

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