在严肃的口音中执行时发现奇怪的行为 - `

时间:2012-04-09 13:21:48

标签: 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 -q sed
sed-4.1.5-8.el5

3 个答案:

答案 0 :(得分:1)

这是因为在解析命令之前,反引号内部(又名反引号,严重重音),\\将替换为\

来自bash手册页:

  

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后跟$,`或   \。没有反斜杠的第一个反引号终止了   命令子      stitution。使用$(命令)表单时,括号之间的所有字符组成命令;没有人接受治疗   特别

只需使用$(...)代替反引号,除非您确实需要预置sh兼容性

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

我还建议使用除/之外的正则表达式分隔符,以便更轻松,例如。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你必须再次逃避字符串。

$ 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

在你的情况下,你应该添加2个额外的斜杠

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