我想替换文件的内容
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
解释字符串。