sed失败,并显示“ s的未知选项”错误


158

我正在尝试使用

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\"


8
* BSD错误消息(包括OSX)是“替换命令中的错误标志:” -在此处包括此错误消息可以使它更加可查询。
2015年

Answers:


355

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

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

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

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


38
只是一条注释,可以帮助将来的用户,我发现这个答案也很有帮助。原始张贴者很可能在其替换内容中(最有可能隐藏在变量中)包含正斜杠。遇到第一个斜杠后,sed认为替换已终止,接下来可以选择替换任何选项(例如g)。
Brian Warshaw

4
干得漂亮(只是要记住缠上变量表达式"'否则你会得到很多$content你的最终结果,而不是内容的$content:))

1
@AbstractDissonance也许,如果您要替换密码或一些奇怪或随机的密码,您仍然可以使用@。您必须找到一个不在分隔字符串中的定界符。
哈维·蒙特罗

5
@ppumkin只需sed -i "s/../../g"用不同的字符ie:代替像ie:这样的“正斜杠”定界符sed -i "s@...@...@g",然后多个斜杠的问题就应该消失了。如果您使用"代替'它,那么它也应该可以与内部变量(即:)一起使用 export var1=bar; sed -i "s@foo@${var1}@g"。更多信息,你可以找到进入真棒SED文件:grymoire.com/Unix/Sed.html
Egel

1
请参阅info sed(源:unix.stackexchange.com/questions/259083/…):“ s(如替代品)命令的语法为's / regexp / replacement / flags'
加布里埃尔·斯台普斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.