【发布时间】: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"将不尝试扩展变量名。你能展示你的实际任务吗?