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