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在第二个示例中所做的那样。他问的是奇怪的行为,而不是如何正确地做。