0

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

# 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
4

3 回答 3

1

这是因为在解析命令之前,内部的反引号(又名反引号、重音符号)\\被替换为。\

从 bash 手册页:

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着 $、` 或 \。前面没有反斜杠的第一个反引号会终止命令替换。使用 $(command) 形式时,括号之间的所有字符组成命令;没有人受到特殊对待。

只需使用$(...)而不是反引号,除非您真的需要 pre-posixsh兼容性

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

我还建议使用正则表达式分隔符,而不是/让这更容易,例如

somevar=$(echo "http://google.com" | sed -e 's|/|\\/|g')
于 2012-04-09T13:26:59.150 回答
0

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

somevar=`echo "http://google.com" | sed -e 's%[/]%\\/%g'`
于 2012-04-09T13:27:31.053 回答
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
于 2012-04-09T13:33:44.723 回答