shell脚本,如何转义变量?

时间:2015-07-08 07:23:05

标签: shell sed escaping

我正在编写一个shell脚本,我在其中输入一个值,并希望将该值用于其他一些命令。我的问题是我想逃避这个价值。

例如,如果我在以下脚本中输入http://example.com

echo "Input a value for my_value"
read my_value

echo $my_value

这将导致http://example.com

但我希望的结果是http\:\/\/example\.com

我如何实现这一目标?


我正在尝试运行的命令是

sed -i s/url/$my_value/g somefile.html

没有转义它变成sed -i s/url/http://example.com/g somefile.html这显然是语法错误..

4 个答案:

答案 0 :(得分:2)

无需在变量中转义/,您可以在sed中使用备用正则表达式分隔符:

sed -i "s~url~$my_value~g" somefile.html

答案 1 :(得分:2)

您可以使用其他字符来分割s个参数。我喜欢,

sed -i 's,url,http://example.com,g'

。如果你真的想要它,你可以在执行

之前使用sed替换参数中的/
url=$(echo "http://example.com"|sed 's,/,\\/,g')
sed -i 's/url/'"$url"'/g' input

答案 2 :(得分:0)

在任何非字母数字字符之前添加斜杠:

$ my_value=http://example.com
$ my_value=$(sed 's/[^[:alnum:]]/\\&/g' <<<"$my_value")
$ echo "$my_value"
http\:\/\/example\.com

但是,如果你想在sed命令中使用它,你需要加倍反斜杠

$ echo this is the url here | sed "s#url#$my_value#g"
this is the http://example.com here
$ echo this is the url here | sed "s#url#${my_value//\\/\\\\}#g"
this is the http\:\/\/example\.com here

答案 3 :(得分:0)

你遇到的问题是你只想用一个不同的文字字符串替换一个文字字符串,但是sed不能对字符串进行操作。有关sed解决方法的信息,请参阅Is it possible to escape regex metacharacters reliably with sed,但您可能最好只使用可以使用字符串的工具,例如: AWK:

awk -v old='original string' -v new='replacement string' '
    s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
    { print }
' file