Linux sed在严重口音内执行时的奇怪行为-`

Linux sed在严重口音内执行时的奇怪行为-`,linux,bash,sed,sh,Linux,Bash,Sed,Sh,出于某种原因,我需要在一些字符串中转义正斜杠 # echo "http://google.com" | sed -e 's/[/]/\\\//g' http:\/\/google.com 但当我尝试在“内部”执行相同的操作时,它会显示: # somevar=`echo "http://google.com" | sed -e 's/[/]/\\\//g'` sed: -e expression #1, char 10: unknown option to `s' 我的sed版本: # rpm

出于某种原因,我需要在一些字符串中转义正斜杠

# echo "http://google.com" | sed -e 's/[/]/\\\//g'
http:\/\/google.com
但当我尝试在“内部”执行相同的操作时,它会显示:

# somevar=`echo "http://google.com" | sed -e 's/[/]/\\\//g'`
sed: -e expression #1, char 10: unknown option to `s'
我的sed版本:

# rpm -q sed
sed-4.1.5-8.el5

这是因为在解析命令之前,
\\
内部的反勾号(也称为反引号、严重重音)被替换为
\

从bash手册页:

当使用旧式的反引号替换形式时,反斜杠保留其字面含义,后面跟$、`或`的情况除外 \。第一个反引号前面没有反斜杠,则终止 指挥子系统 机构。使用$(command)表单时,括号之间的所有字符组成命令;没有人得到治疗 特别是

只要使用
$(…)
而不是反勾号,除非您确实需要posix之前的
sh
兼容性

somevar=$(echo "http://google.com" | sed -e 's/[/]/\\\//g')
我还建议使用除
/
之外的正则表达式分隔符来简化此过程,例如:

somevar=$(echo "http://google.com" | sed -e 's|/|\\/|g')

使用不同的分隔符,您会没事的。我不能从命令行告诉您为什么它可以工作,但是只要修复它,使它在任何地方都可以工作就行了

somevar=`echo "http://google.com" | sed -e 's%[/]%\\/%g'`

你必须再次转义字符串

$ echo `echo \x`  # tilde is executing "echo x"
x
$ echo `echo \\x`   # tilde is executing "echo \x"
x
$ echo `echo \\\x`   # tilde is executing "echo \\x"
\x
在您的情况下,您应该添加两个额外的斜杠

$ echo `echo "http://google.com" | sed -e 's/[/]/\\\\\//g'`
http:\/\/google.com

$(…)
是POSIX外壳;可能需要担心的是POSIX之前的旧shell。但无论如何,这与问题无关;第一个例子很奇怪,
sed
通常不允许
[]
转义它的正则分隔符。@geekosaur谢谢,我不知道。尽管
$(…)
已经存在了很长时间,但仍然有这么多人使用反勾号,这总是让我感到惊讶。我觉得奇怪的是,你需要避开斜杠。也许你的问题可以更优雅地解决。它不起作用,$somevar以
http://google.com
,您仍然需要像我在回答中所说的那样再次转义字符串。否,您只需要在使用时正确引用它。或者添加正确的引用。一般来说,如果不建议使用变量,请使用
echo
查看实际值,但至少必须使用正确的引号(即双引号)。这是一个示例,说明了为什么他的代码不起作用,我会像je4d在第二个示例中所做的那样。他问的是奇怪的行为,而不是如何正确地做。