我有一个变量,我想使用双反斜杠('\\')替换每次出现的反斜杠('\')外壳参数扩展 https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html。最初,我使用了以下结构:
$ var='\\a\b'
$ echo "${var//\\/\\\\}"
\\\\a\\b
这工作正常,但它破坏了 vim 语法突出显示 - 显然,vim 无法处理\\}
部分。因此,我决定将反斜杠存储在变量中并使用 to 来避免语法突出显示问题:
$ bsl='\'
$ echo "${var//$bsl/$bsl$bsl}"
\\a\b
令我惊讶的是,它不起作用,尽管它可以与任何字母数字符号一起正常工作。那么,也许我需要在变量中存储 2 个反斜杠?让我们尝试一下:
$ bsl='\\'
$ echo "${var//$bsl/$bsl$bsl}"
\\\\\\\\a\\\\b
现在,它从不工作变成了工作时间的两倍。最终,我发现达到预期结果并保留 vim 突出显示的唯一方法如下:
$ bsl='\'
$ echo "${var//\\/$bsl$bsl}"
\\\\a\\b
虽然我已经找到了解决问题的方法,但我的问题是:为什么参数扩展可以通过反斜杠以这种方式工作?对我来说,这种行为毫无意义。
根据 Bash 手册,${parameter/pattern/string}
,“该模式被扩展以产生一个模式,就像路径名扩展一样。”引用变量将保护它免受路径名扩展和引号/反斜杠删除的影响。
$ echo "${var//$bsl/$bsl$bsl}"
\\a\b
$ echo "${var//"$bsl"/$bsl$bsl}"
\\\\a\\b
不管怎样,如果你使用的是 GNU 系统,你可以使用printf %q
以获得类似的结果。
$ printf '%q\n' "$var"
\\\\a\\b
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)