【问题标题】:sed strange behaviour when executed inside grave accent - `sed 在重音中执行时出现奇怪的行为 - `
【发布时间】:2012-04-21 20:42:21
【问题描述】:

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

# 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

【问题讨论】:

  • 我觉得很奇怪你需要转义斜线。也许您的问题可以更优雅地解决。

标签: linux bash sed sh


【解决方案1】:

你必须再次转义字符串。

$ 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

【讨论】:

  • 或添加适当的引用。作为一般评论,如果不建议使用变量,请使用echo 查看实际值,但至少必须使用正确的引号(即双引号)。
  • 这是一个例子来说明为什么他的代码不起作用,我会像 je4d 在他的第二个例子中那样做。他问的是奇怪的行为,而不是如何正确地做到这一点。
【解决方案2】:

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

来自 bash 手册页:

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

只需使用 $(...) 而不是反引号,除非您确实需要 pre-posix sh 兼容性

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

我还建议使用 / 以外的正则表达式分隔符来简化此操作,例如

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

【讨论】:

  • $(...) 是 POSIX 外壳;人们可能需要担心的是较旧的 pre-POSIX shell。但无论如何,它与问题无关; first 示例很奇怪,sed 通常不允许[] 转义其正则表达式分隔符。
  • @geekosaur 谢谢,我不知道。尽管$(...) 已经存在了多长时间,但仍有这么多人仍然使用反引号,这总是让我感到惊讶。
【解决方案3】:

使用不同的分隔符就可以了。我无法告诉你为什么它可以从命令行运行,但只需修复它,让它在任何地方都可以运行。

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

【讨论】:

  • 它不起作用,$somevar 以http://google.com 结尾,你仍然需要像我在回答中所说的那样再次转义字符串
  • 不,你只需要在使用时正确引用即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多