1

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

编码:

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

2 回答 2

0

您必须反斜杠特殊字符。切换到功能更强大的工具可能会更容易,例如 Perl,它已经具有执行此操作的功能 ( quotemeta, s/\Q$var\E/.../)。

于 2013-04-09T14:16:34.650 回答
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 scriptcat script. 你会撤消那个替换。-x是可选的;它只是向您显示脚本正在执行的内容。

于 2013-04-09T14:21:42.403 回答