【问题标题】:Replacing $ with \$ in string variable在字符串变量中用 \$ 替换 $
【发布时间】:2017-12-21 16:26:38
【问题描述】:

我的 bash 脚本,我有一个带有 $ 签名的字符串变量,它没有被转义。它看起来像这样:

x="hello $world"

显然,当我echo "$x" 时,输出为hello,因为$world 被解释为一个变量。我的目标是将字符串修改为hello \$world。我尝试了几种技术,如下所示。他们似乎都没有工作:

y="$(echo "$x" | sed 's/\$/z/g')"(输出hello

y="$(echo "$x" | sed 's/$/z/g')"(输出 hello z,即使我没有在 sed 中转义 \

甚至通过以下方式尝试了 Bash 的原生字符串替换:

y=${x//\$/z}(输出hello

我意识到如果字符串没有存储在变量中,我可以轻松地执行任何这些操作,但是根据我的脚本的工作方式,这个字符串将首先存储在变量中,所以我需要弄清楚如何添加之后的\。我不在乎是创建字符串的新副本还是编辑相同的字符串。

【问题讨论】:

  • 在您的第二个 sed 命令中,$(引自 bash)匹配 行尾,因为 sed 与基本正则表达式一起使用。
  • 如何将字符串存储在变量中?我就像你展示的那样做,$world 已经消失了,你无法找回它,如 Toby 的回答所示。
  • 将您的(第一个)sed 命令与单引号 '$x' 进行对比,如下所示:y="$(echo '$x' | sed 's/\$/z/g')"。此版本将$y 设置为zx
  • @BenjaminW。我正在使用一个命令(具体来说是jq),它返回一个字符串,其中包含多个未转义的$ 符号。
  • 如果你有一个字符串str 包含一个未转义的$,比如hello $world(当你发出declare -p str 时,它的显示完全一样),那么echo "$str"尝试扩展变量名。你能展示你的实际任务吗?

标签: string bash shell sed


【解决方案1】:

赋值($world为空或未定义)与写法相同

x="hello "

您对$x 所做的任何操作都不会在其中看到$,除非您从外部添加它。

也许你的意思是:

x='hello $world'

【讨论】:

    【解决方案2】:

    你可以使用BASH:

    x='hello $world'
    echo "${x//\$/\\$}"
    
    hello \$world
    

    【讨论】:

    • 问题有x="hello $world",而不是x='hello $world'(因此问题-$x 中没有$)。
    • 你已经知道双引号会导致变量扩展,所以我们需要使用单引号。
    猜你喜欢
    • 2020-07-09
    • 2011-09-29
    • 2013-02-16
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多