变量的SED替换

变量的SED替换,sed,substitution,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 emspas

我有一个名为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

你能帮我一下吗?

你在使用引号时要相当小心。您还需要学习如何在一个过程中执行多个操作,和/或如何使用管道

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
可以查看您想要的内容

注意,我最初在替换操作中使用了
/
作为分隔符;然而,正如正确指出的那样,这是行不通的,因为URL中有斜杠。我的正常回退字符是
%
——如图所示——但这可能出现在某些URL中,可能不合适。如果我需要担心的话,我可能会使用一个控件字符,比如control-a,或者我会使用Perl,它可以在不混淆的情况下播放


您还可以将三个独立的
-e
表达式组合为一个表达式,并用分号替换它们。然而,我更喜欢清楚地区分这三个操作。

使用引号时必须相当小心。您还需要学习如何在一个过程中执行多个操作,和/或如何使用管道

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
可以查看您想要的内容

注意,我最初在替换操作中使用了
/
作为分隔符;然而,正如正确指出的那样,这是行不通的,因为URL中有斜杠。我的正常回退字符是
%
——如图所示——但这可能出现在某些URL中,可能不合适。如果我需要担心的话,我可能会使用一个控件字符,比如control-a,或者我会使用Perl,它可以在不混淆的情况下播放


您还可以将三个独立的
-e
表达式组合为一个表达式,并用分号替换它们。但是,我更喜欢清楚地区分三个操作。

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

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

这将设置变量,然后在主脚本的上下文中运行check.txt

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

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

这将设置变量,然后在主脚本的上下文中运行check.txt

,尽管您没有说明失败的原因,但我想我看到了问题所在

我建议你这样做:

sed "s|\$URL|${emsurl}|g"
也就是说,第一个
$
需要转义,因为您需要它。然后,我建议您使用
(管道)作为分隔符,而不是
/
,因为它不用于字符串中。最后,使用
确保shell将内容解释为字符串

然后,您可以将所有内容通过管道连接在一起,从而不需要任何临时文件:

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

虽然你没有说什么失败,但我想我看到了问题所在

我建议你这样做:

sed "s|\$URL|${emsurl}|g"
也就是说,第一个
$
需要转义,因为您需要它。然后,我建议您使用
而不是
(管道)作为分隔符,因为它不在字符串中使用。最后,使用
确保shell将内容解释为字符串

然后,您可以将所有内容通过管道连接在一起,从而不需要任何临时文件:

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

变量替换应在sed表达式之外,并且应转义“$”;在您的情况下,类似这样的情况:

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

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

变量替换应该在sed表达式之外,并且“$”应该转义;在您的情况下,类似这样的情况:

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

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

+1用于开箱思考-但不能帮助他学习如何正确使用
sed
。他还需要升级脚本来处理未设置的变量(
${URL:?}
作为基本要求)。此外,不需要使用
/check.txt
;如果导出变量,它可以作为
/check.txt
sh check.txt
运行。如果只是设置变量,则需要使用
命令。+1来进行开箱思考,但不能帮助他学习如何正确使用
sed
。他还需要升级脚本来处理未设置的变量(
${URL:?}
作为基本要求)。此外,不需要使用
/check.txt
;如果导出变量,它可以作为
/check.txt
sh check.txt
运行。如果只是设置了变量,则需要使用
命令。您需要选择不同的分隔符,
/
用于替换文本。尊敬的Jon、DarkDust和Steve。非常感谢你的帮助。我现在明白我错在哪里了。非常感谢。您需要选择一个不同的分隔符,
/
用于替换文本。亲爱的Jon、DarkDust和Steve。非常感谢你的帮助。我现在明白我错在哪里了。非常感谢你,你都能做到