我有一个变量,其中包含一个带有$美元符号的字符串,我想使用sed
来修改文本文件。每当变量中有美元符号时我都会收到错误,但是当没有美元符号时它会正常工作。我怎样才能解决这个问题?我在一个双引号中使用多个变量和文字文本。
代码:
sudo sed -i "textFile.txt" -e "s,\($var1\):\(.*:\):,\1:$var2WithDollarSign:$var3,g" textfile.txt
答案 0 :(得分:0)
你必须反斜杠特殊字符。切换到更强大的工具可能更容易,例如Perl,已经具备了执行该功能的功能(quotemeta
,s/\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
是可选的;它只显示脚本正在执行的内容。