这是我关于 SO 的第一篇文章(虽然潜伏了很长时间)所以我提前为我肯定会犯的无数“失礼”和其他错误道歉。
我一直在谷歌上寻找一段时间,现在试图找到一个答案,当内部参数扩展在双引号内时如何解析引号,似乎我有错误的关键字或非常扭曲的尝试这个。
例如,如果我有一个像 It's a complicated string
这样的字符串,我想将该字符串转换为序列 It'\''s a complicated string
使用bash 的参数扩展 ${parameter/pattern/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
至于sputnick的回答,我更疑惑了:
$ 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
编辑2:
显然这是一个至少影响 bash 4.1 和 4.2 并在 bash 4.3 中修复的错误。因此,从上面的测试中没有什么可以理解的。
最佳答案
以下作品(带或不带双引号):
echo "${str//\'/\'\\\'\'}"
每个单引号都用反斜杠转义,以防止它成为单引号字符串的开头。文字反斜杠也在替换模式中进行了转义。
从 bash
4.3 session 直接复制和粘贴:
$ str="It's a complicated string"
$ echo "${str//\'/\'\\\'\'}"
It'\''s a complicated string
$ echo ${str//\'/\'\\\'\'}
It'\''s a complicated string
bash
3.2 中的输出是相同的。
关于Bash 参数扩展 ${parameter/pattern/string} 带引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27003278/