ChatGPT解决这个技术问题 Extra ChatGPT

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

sed

关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为 Stack Overflow 的主题。 1年前关闭。改进这个问题

我正在尝试使用

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)是“替代命令中的错误标志:”——将其包含在此处以使其更易于搜索。

E
Elijah Lynn

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

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

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

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


只是一个帮助未来用户的注释,因为我发现这个答案也很有帮助。最初的海报很可能在他的替代品中有一些东西(很可能隐藏在变量中),其中包含正斜杠。在遇到第一个斜杠后,sed 认为替换已终止,接下来出现的任何内容都是一个选项(例如 g)。
做得很好(请记住用 " 而不是 ' 包装变量表达式,否则您将在最终结果中得到很多 $content 而不是 $content 的内容 :))
@AbstractDissonance 也许如果您要替换密码或其他奇怪或随机的东西,您仍然有 @ 在其中。您必须找到一个不包含在您的替换字符串中的分隔符。
@ppumkin 只需将“正斜杠”分隔符如 ie: sed -i "s/../../g" 替换为不同的字符 ie: 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 命令中。”