变量的SED替换
我有一个名为check.txt的文件,其内容如下:变量的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
$ 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。非常感谢你的帮助。我现在明白我错在哪里了。非常感谢你,你都能做到