【发布时间】:2015-01-16 04:05:26
【问题描述】:
这是我在 SO 上的第一篇文章(虽然潜伏了很长时间),所以我提前为我肯定要犯的众多“失礼”和其他错误道歉。
我已经在谷歌上找了一段时间了,现在试图找到在双引号内的参数扩展内如何解析引号的答案,似乎我要么有错误的关键字,要么是一个非常扭曲的尝试尝试这个。
例如,如果我有一个像It's a complicated string 这样的字符串,我想使用bash 的参数扩展${parameter/pattern/string} 将该字符串转换为序列It'\''s a complicated string。 我知道我可以使用许多其他内置或外部工具之一来实现该结果(我自己非常喜欢 sed),但这个问题实际上是关于了解 bash 的想法,以便我可以把我的自己的心来放松。
Bash's reference 在描述其“模式”时似乎没有具体说明在这种特殊情况下会发生什么,而the closest question on SO 在我的情况下似乎不起作用:
$ echo "$str"
It's a complicated string
$ echo "${str//'/'\''}"
> ^C
$ echo "${str//'/'\''}"
> ^C
$ echo "${str//\'/'\''}"
> ^C
$ echo "${str//\'/\'\''}"
> ^C
$ echo "${str//\'/\'\'\'}"
It\'\'\'s a complicated string
$ echo "${str//\\'/\'\'\'}"
It's a complicated string
$ echo "${str//\\'/\\'\'\'}"
It's a complicated string
$ echo "${str//\\'/\\'\\'\'}"
It's a complicated string
$ echo "${str//\\'/\\'\\'\\'}"
It's a complicated string
$ echo "${str//\\\'/\\'\\'\\'}"
> ^C
$ echo "${str//\\\'/\\\'\\'\\'}"
It's a complicated string
$ echo "${str//\\\'/\\\'\\\'\\'}"
> ^C
$ echo "${str//\\\'/\\\'\\\'\\\'}"
It's a complicated string
(> ^C 行表示引号未正确解析,系统提示我输入更多内容,我每次使用 Ctrl-C 时都无情地拒绝。)
请大家解释一下 bash 究竟是如何看待这个问题的?我真的希望这只是我们之间的沟通问题,我有点喜欢他。 :)
编辑:
对于那些想知道的人,Etan Reisner 的回答很有效:
$ q=\'
$ echo "${str//\'/$q\'$q}"
It'\''s a complicated string
至于斯普特尼克的回答,我更疑惑了:
$ echo "${str//\047/\047\\\047\047}"
It's a complicated string
$ echo "${str//\047/\047\047}"
It's a complicated string
$ echo "${str//\'/\047\'\047}"
It\047\'\047s a complicated string
$ echo "${str//\'/\047\047\047}"
It\047\047\047s a complicated string
$ echo "${str//'/\047\047\047}"
> ^C
$ echo "${str//\047/\047\047\047}"
It's a complicated string
$ echo "${str//\047/\047\\\047\047}"
It's a complicated string
EDIT2:
显然,这是一个至少影响 bash 4.1 和 4.2 的错误,并已在 bash 4.3 中修复。因此,从上面的测试中没有什么可以理解的。
【问题讨论】:
-
使用
\\',对于 bash,你有一个反斜杠并且你正在打开一个单引号(而 Bash 正在等待你关闭它——你可以通过按 Ctrl-C 来取消它)。尝试一些有趣的事情:不要按 Ctrl-C,而是输入I love bananas'}"并享受。 -
@gniourf_gniourf 我可以理解
${parameter/pattern/string}的“模式”部分中的行为,但在“字符串”部分中,所有字符都应该是文字吗? -
一个更好的问题是,为什么要创建这样的字符串?原件是一个包含单引号的完全有效的字符串;您的编辑似乎试图在字符串中添加带引号的单引号(我可能会添加不正确),以尝试在字符串中包含
bash语法。 -
-
@EtanReisner 来自手册:模式被扩展以产生一个模式,就像在文件名扩展中一样。所以这里没有惊喜。