用特殊字符的字符串替换shell脚本中的字符串

时间:2015-04-17 08:58:04

标签: shell unix sed

我正在尝试用特殊字符的字符串替换shell脚本中的字符串:

name="test&commit"
echo "{{name}}" | sed "s/{{name}}/$name/g"

我得到的结果是

test{{name}}commit

我知道添加\ before&将使它工作但名称参数由用户给出,所以我希望我的代码可以预测。有谁知道如何实现这个目标?

3 个答案:

答案 0 :(得分:2)

您需要使用另一个sed命令在给定输入字符串中的所有特殊字符之前添加反斜杠。

$ name="test&commit"
$ name1=$(sed 's/[^[:alpha:][:digit:][:blank:]]/\\&/g' <<<"$name")
$ echo $name1
test\&commit
$ echo "{{name}}" | sed "s/{{name}}/$name1/g"
test&commit

它会被最小化,

$ name="test&commit"
$ echo "{{name}}" | sed "s/{{name}}/$(sed 's/[^[:alpha:][:digit:][:blank:]]/\\&/g' <<<"$name")/g"
test&commit

答案 1 :(得分:1)

稍微改变提供模板和值的方式:

$ cat template

   Dear {{name}}
    I hope to see you {{day}}.

(模板是{{var}}的文件,用值实例化)

$ name='Mary&Susan' day=tomorrow    perl -pe 's/{{(\w+)}}/$ENV{$1}/g' template

   Dear Mary&Susan,
    I hope to see you tomorrow.

答案 2 :(得分:0)

在perl中你可以用\ Q \ P来关闭表达式。
我填写了vars模板,占位符和名称:

$ echo "template=$template"
template=The name is {{name}} and we like that.
$ echo "placeholder=$placeholder"
placeholder={{name}}
$ echo "name=$name"
name=test&commit

替换将用

执行
$ echo $template | perl -pe 's/\Q'$placeholder'\E/'$name'/g'
The name is test&commit and we like that.