【问题标题】: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\"

【问题讨论】:

标签: sed


【解决方案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 命令中的任何其他单个字符统一替换。”
猜你喜欢
  • 2013-04-28
  • 2016-03-19
  • 2014-12-08
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
相关资源
最近更新 更多