在bash中使用带有美元符号的变量

时间:2013-04-09 14:07:10

标签: string bash variables sed

我有一个变量,其中包含一个带有$美元符号的字符串,我想使用sed来修改文本文件。每当变量中有美元符号时我都会收到错误,但是当没有美元符号时它会正常工作。我怎样才能解决这个问题?我在一个双引号中使用多个变量和文字文本。

代码:

sudo sed -i "textFile.txt" -e "s,\($var1\):\(.*:\):,\1:$var2WithDollarSign:$var3,g" textfile.txt

2 个答案:

答案 0 :(得分:0)

你必须反斜杠特殊字符。切换到更强大的工具可能更容易,例如Perl,已经具备了执行该功能的功能(quotemetas/\Q$var\E/.../)。

答案 1 :(得分:0)

我认为您的问题是您正在运行sudo来运行sed命令:

sudo sed -i "textFile.txt" -e "s,\($var1\):\(.*:\):,\1:$var2WithDollarSign:$var3,g" textfile.txt

麻烦的是你正在使用的shell处理一次参数,然后sudo代表你运行的shell再次处理参数。我建议创建一个包含sed命令的shell脚本并设置shell变量,然后从sudo运行它。

cat > script <<!
sed -i "textFile.txt" -e 's,\($var1\):\(.*:\):,\1:$var2WithDollarSign:$var3,g' textfile.txt
!
sudo sh -x script
rm -f script

它将节省大量的脑力。

实施例

$ cat xx.sh
var1='theperson'
var2WithDollarSign='the$voodoo$wizard'
var3='Albuquerque'
cat > script <<!
sed -i "textFile.txt" -e 's,\($var1\):\(.*:\):,\1:$var2WithDollarSign:$var3,g' textfile.txt
!
cat script
rm -f script
$ sh xx.sh
sed -i "textFile.txt" -e 's,\(theperson\):\(.*:\):,\1:the$voodoo$wizard:Albuquerque,g' textfile.txt
$

我已将su sh -x script替换为cat script。你要撤消这种替代。 -x是可选的;它只显示脚本正在执行的内容。