sed命令出现“未知选项`s'”错误。

245
我正在尝试使用。
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\"

9
*BSD操作系统(包括OSX)的错误信息是"bad flag in substitute command:",我在这里提供这个信息是为了让它更容易在谷歌上搜索到。 - tripleee
1
重复 https://dev59.com/cF4c5IYBdhLWcg3wjq_R - tripleee
1个回答

516
问题出在斜杠上:你的变量包含它们,最终的命令将类似于sed "s/string/path/to/something/g",有太多的斜杠。
由于sed可以使用任何字符作为分隔符(无需声明新的分隔符),因此您可以尝试使用另一个在替换字符串中不出现的字符。
replacement="/my/path"
sed --expression "s@pattern@$replacement@"

请注意,这不是万无一失的:如果替换字符串后来包含 @,由于相同的原因它将会出现错误,并且任何反斜杠序列(例如 \1)仍将按照 sed 规则解释。使用 | 作为分隔符也是一种不错的选择,因为它与 / 的可读性类似。


51
给未来的用户留个便条,我也觉得这个答案很有用。原帖作者很可能在他的替换文本中(很可能是变量中)包含了斜杠“/”。在第一个斜杠出现后,sed 就认为替换结束了,接下来的任何内容都会被视为选项(例如 g)。 - Brian Warshaw
5
干得不错(只要记得用双引号 " 而不是单引号 ' 包裹变量表达式,否则最终结果中会出现很多 $content 而非 $content 的内容 :))。 - user257319
1
@AbstractDissonance 如果你正在替换密码或其他奇怪或随机的内容,可能仍然会包含@。你必须找到一个不包含在你的替换字符串中的分隔符。 - Xavi Montero
11
请将以下内容翻译成中文:@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 - Egel
3
请参见 info sed(来源:https://unix.stackexchange.com/questions/259083/replace-unix-path-inside-a-file/259087#259087):“s(替换)命令的语法为 's/regexp/replacement/flags'。在任何给定的 s 命令中,'/'字符可以被任何其他单个字符统一替换。” - Gabriel Staples
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接