我有一个名为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
你能帮我吗?
答案 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 @)。