Bash 参数扩展 ${parameter/pattern/string} 带引号

标签 bash replace quotes

这是我关于 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/

相关文章:

java - Bash 脚本无法将 Java 程序作为 cron 作业运行

python - 当我通过终端使用 VIM 时,我不断收到重复的文件,并在末尾附加了 ~。这些是什么?

regex - phpstorm 将 array() 表示法替换为 [ ] 短语法

bash - eval - 如何跳过单引号中的 $ 字符被评估

bash - 如何将 bash/zsh 参数转发到另一个 shell

linux - 如何在同一目录中的另一个脚本中使用 bash 脚本中的函数和变量?

linux - 如何根据上一条命令的结果运行不同的命令?

javascript - 搜索键名称的开头并重命名

string - 从字符串中删除空字符

python - PyYAML 转储格式