反斜杠字符的 Bash 参数扩展规则

2024-03-03

我有一个变量,我想使用双反斜杠('\\')替换每次出现的反斜杠('\')外壳参数扩展 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(使用前将#替换为@)

反斜杠字符的 Bash 参数扩展规则 的相关文章

  • C# 资源文件中的 Tab 键切换

    如何向字符串资源添加制表符 t text 不起作用 您必须显式添加制表符 最简单的方法可能是在记事本中键入字符串 显式设置制表符而不是使用转义字符 并将文本复制并粘贴到资源编辑器中 对于换行符 您也会遇到类似的问题 添加换行符的最简单方法是
  • 如何替换每行中出现的所有字符串?

    我想在以下脚本中将所有出现的 用户名 替换为 但它仅替换第一次出现的情况 ls al sed s username 这就是 sed 默认情况下的工作方式吗 提前致谢 你需要g 全局 修饰符 sed s username g
  • 如何在 Bash 中将字符串转换为小写

    有办法进去吗bash questions tagged bash将字符串转换为小写字符串 例如 如果我有 a Hi all 我想将其转换为 hi all 有多种方法 POSIX标准 https en m wikipedia org wiki
  • Openshift 上的自定义 Node.js 版本

    我在运行自定义节点版本时遇到问题node0 10您可以在开放班次中找到墨盒here https github com DavidReinberger openshift meteor leaderboard customNode 我可以很好
  • 如何摆脱每个新终端会话上运行的某些内容?

    我正在使用狮子 我在每个新的终端会话上都会输出一个错误 bash rvm add to path command not found 这是一个几乎全新的用户帐户 RVM 安装在计算机上的另一个帐户上 bashrc 和 bash profil
  • perl生成字符串来匹配正则表达式

    我尝试找到一种方法来生成与正则表达式匹配的字符串 例如以下正则表达式 A Z 6 6 A Z2 9 A NP Z0 9 A Z0 9 3 3 0 1 我尝试过 Cpan 上的一些 perl 模块不起作用 gt 字符串 随机 gt 正则表达式
  • envsubst 不能进行就地替换吗?

    我有一个配置文件 其中包含一些 ENV VARIABLE 样式的变量 This is my file It might contain EXAMPLES of text 现在我希望将该变量替换为保存在实际环境变量中的值 所以我正在尝试这个
  • 错误:在 C++ 中从“const char [5]”转换为非标量类型

    public string str Test string str this gt str str cout lt lt constructor lt
  • 如何在 Fortran 90 中迭代包含数字、单词和空格的字符串?

    文件说明 STL文件由以下部分组成 solid
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • bash、zsh :声明 [*] (天哪)

    我正在使用具有以下语法的 bash 脚本 declare a THIS 这在 zsh 中似乎是非法的 我收到 未找到匹配项 THIS 错误 谁能帮我把它翻译成 zsh 吗 另外 什么是 语法是什么意思 我知道我们正在声明一个数组 但为什么要
  • Java中的String为什么是不可变的对象,但我在创建一个对象后仍然可以更改它的值? [复制]

    这个问题在这里已经有答案了 如果我可以创建一个字符串并给它一个值 这怎么可能呢 然后 我可以像这样简单地覆盖它的值 String a abc a def 我怎么可能改变的值a 我一定在这里遗漏了一些东西 我知道每当创建 String 对象时
  • 在C#中,如何检测一个字符是否是非ASCII字符?

    我想在 C 中检查 char 是否包含非 ASCII 字符 检查特殊字符的最佳方法是什么 例如志 or ASCII 范围为 0 127 因此只需检查该范围 char c a or whatever char you have bool is
  • 添加反斜杠而不转义[重复]

    这个问题在这里已经有答案了 我需要逃离 字符串中的 字符 问题是每当我string string replace 结果是 添加额外的反斜杠来转义原始反斜杠 如何删除这个多余的反斜杠 结果 仅显示 实际上字符串是 gt gt gt str g
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 编写脚本时,#!/usr/bin/perl 和 #!/usr/bin/env perl 有什么区别?

    显然 这同样适用于用 python bash sh 等替代 perl 昆汀下面的答案显然是正确的 所以我接受了它 但我想我实际上的意思是 两种使用 的方式的优点和缺点是什么 调用 perl python bash 作为脚本的解释器 有人提到
  • sed-删除不包含模式的行

    我很惊讶我在 SO 上找不到与此类似的问题 如何使用 sed 删除所有不包含特定模式的行 例如 我有这个文件 cat kitty dog giraffe panda lion tiger 我想要一个 sed 命令 当调用该命令时 它将删除所
  • 使用 cURL 从 shell 发布 4GB 文件

    我尝试将文件大小为 4GB 的文件发布到 REST API cURL 不会上传此大小的文件 而是 POST 内容长度为 0 的文件 curl v i d work large png H Transfer Encoding chunked
  • 替换 Javascript 中的引号?

    对于我正在制作的网络应用程序 我将收到文本字符串 其中偶尔包含引号 因为我接下来要 document writing 字符串 所以需要将它们更改为撇号或转义 我该怎么做 因为当我尝试时它似乎不起作用 特别是我认为因为字符串的引号阻止了脚本的
  • SQL Server - 在设置 COLLATE Latin1_General_CS_AS 的情况下搜索不区分大小写

    家长提问 https stackoverflow com questions 50974562 sql server update to match and replace only exact words感谢 Iamdave 部分问题得到

随机推荐