SED替代变量

时间:2010-09-14 18:54:52

标签: sed substitution

我有一个名为check.txt的文件,其中包含以下内容:

$ cat check.txt
~/bin/tibemsadmin -server $URL-user $USER -password $PASWRD
$

我有一个主脚本,其中$ URL,$ USER,$ PASWRD的值是从主脚本获得的。我想使用SED实用程序将$ URL,$ USER,$ PASWRD替换为check.txt中的实际值。

我这样想但是失败了。

emsurl=tcp://myserver:3243
emsuser=test
emspasswd=new
sed s/$URL/${emsurl}/g check.txt >> check_new.txt
sed s/$USER/${emsuser}/g check.txt_new.txt >> check_new_1.txt
sed s/PASWRD/${emspasswd}/g check_new_1.txt >> final.txt

我的final.txt输出如下所示:

~/bin/tibemsadmin -server tcp://myserver:3243 -user test -password new

你能帮我吗?

4 个答案:

答案 0 :(得分:3)

您必须非常小心使用引号。您还需要了解如何在一次通过中执行多个操作,和/或如何使用管道。

emsurl=tcp://myserver:3243
emsuser=test
emspasswd=new
sed -e "s%\$URL%${emsurl}%g" \
    -e "s%\$USER%${emsuser}%g" \
    -e "s%\$PASWRD%${emspasswd}%g" check.txt >final.txt

你的问题是shell扩展了命令行中的'$ URL'(可能没有任何内容),这意味着sed必须看到你想要的东西。通过使用$转义\sed可以看到您的意图。

请注意,我最初使用/作为替代操作中的分隔符;但是,正如DarkDust正确地指出的那样,由于URL中存在斜杠,因此无效。我正常的后备字符是% - 如图所示 - 但可能出现在某些网址中,可能不合适。我可能会使用控制字符,例如control-A,如果我需要担心的话 - 或者我会使用Perl来播放而不会感到困惑。

您还可以将三个单独的-e表达式合并为一个替换它们的分号。但是,我更倾向于将三个操作的清晰度分开。

答案 1 :(得分:2)

您可以通过修改主脚本采用稍微不同的方法,如下所示: -

export URL="tcp://myserver:3243"
export USER=test
export PASWRD=new
. ./check.txt

这将设置变量,然后在主脚本

的上下文中运行check.txt

答案 2 :(得分:1)

虽然你没有说出什么是失败的,但我想我看到了问题。

我建议你这样做:

sed "s|\$URL|${emsurl}|g"

也就是说,第一个$需要进行转义,因为你需要字面意思。然后,我建议您使用/(管道)作为分隔符而不是|,因为它没有在您的字符串中使用。最后,使用"确保shell将内容解释为字符串。

然后,您可以将所有内容组合在一起,不需要任何临时文件:

sed "s|\$URL|${emsurl}|g" | sed "s|\$USER|${emsuser}|g" | sed "s|\$PASSWRD|${emspasswd}|g"

答案 3 :(得分:0)

变量替换应该在sed表达式之外,并且'$'应该被转义;在你的情况下是这样的:

sed -e 's/\$URL/'$emsurl'/g' -e 's/\$USER/'$emsuser'/g' -e 's/\$PASSWORD/'$emaspasswd'/g'

无论如何,我会避免使用$来匹配模板文件中的占位符,因为它会导致与BASH变量混淆,而是使用不同的模式(例如@ URL @)。