sed因"s'未知选项"错误而失败

Mr.*_*ing 138 sed

我正在尝试使用

sed -i -e "s/.*seb.*/    \"$ftp_login_template\"/" $ftp_dir
Run Code Online (Sandbox Code Playgroud)

但是我收到这个错误:

sed: -e expression #1, char 34: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么因为这完美地工作:

sed -i -e "s/.*wbspassword.*/    \"wbspassword\": \"$password\",/" $user_conf
Run Code Online (Sandbox Code Playgroud)

关于我做错了什么的任何想法?

这可能是问题吗? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"

pru*_*nat 315

问题在于斜杠:你的变量包含它们,最后的命令就像sed "s/string/path/to/something/g"包含太多斜杠一样.

由于sed可以将任何char作为分隔符,因此您可以尝试使用另一个未出现在替换字符串中的字符:

replacement="/my/path"
sed -e "s@pattern@$replacement@"
Run Code Online (Sandbox Code Playgroud)

请注意,这不是防弹:如果替换字符串稍后包含@它将因同样的原因而中断,并且\1仍将根据sed规则解释任何反斜杠序列.

  • 只是一个帮助未来用户的注释,因为我发现这个答案也很有帮助.最初的海报很可能在他的替代品中(很可能隐藏在变量中)包含正斜杠.在遇到第一个斜杠之后,sed认为替换被终止,并且接下来作为一个选项(例如`g`). (34认同)
  • 做得很好(只记得用```````来包装变量表达式,否则你会在你的最终结果中得到很多`$ content`而不是`$ content` :)的内容.) (4认同)
  • @ppumkin只是取代"正斜杠"分隔符,例如:`sed -i"s /../../ g"`用不同的字符即:`sed -i"s @ ... @ ... @ g" `,那么多个斜线的问题应该消失.如果你使用```而不是''`它也适用于里面的变量,即:`export var1 = bar; sed -i"s @ foo @ $ {var1} @g"`.更多信息你可以找到令人敬畏的sed文档:http://www.grymoire.com/Unix/Sed.html (4认同)
  • 请参阅“info sed”(来源:https://unix.stackexchange.com/questions/259083/replace-unix-path-inside-a-file/259087#259087):**“ s 的语法(如Replace) 命令是 's/regexp/replacement/flags'。 / 字符可以统一替换为任何给定 s 命令中的任何其他单个字符。"** (2认同)