如何使用 sed 将一个字符串替换为以 $ 开头的另一个字符串?

如何使用 sed 将一个字符串替换为以 $ 开头的另一个字符串?

我想替换文件的内容

cat test.sh
attribute = "metaapp"

所以我尝试用 sed 的 hep替换metaapp字符串${meta.app}

 sed -i s/metaapp/${meta.app}/g test.sh

并出现错误。如何使用 sed 以便输出看起来像这样

attribute = "${meta.app}"

答案1

这不是关于sed,而是关于

${meta.app}几乎类似于参数替换的语法(其他名称:变量替换,变量扩展):。${var}变量名称不能包含点。还有像${var-foo}where 这样的语法-也不属于名称,还有更多;但${var.foo}${meta.app}未定义。

这就是你的 shell 抱怨替换错误的原因。sed甚至没有启动。尝试一下,mumblemumble ${meta.app}错误会是一样的。你不会看到一条错误说mumblemumble找不到命令;shell 不会走到这一步。

要修复此问题,请用单引号括住整个 sed 表达式:

sed -i 's/metaapp/${meta.app}/g' test.sh

单引号中的字符串不会被 shell 扩展。您可以通过转义麻烦的字符来实现相同的效果,同时使用双引号或根本不使用引号 ( s/metaapp/\${meta.app}/g)。但您需要知道什么在这种情况下,字符需要转义。使用单引号,您可以轻松保护整个字符串。

这就是你如何将 shell 移开。如果你需要'字符串中的文字,或者需要从 shell 进行任何类型的替换,那就没那么容易了。幸运的是,你不需要,所以单引号很方便,也是正确的做法。现在你只需要关心如何sed解释字符串。

相关内容