0

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

4 回答 4

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

您的问题是外壳程序在您的命令行中扩展了“$ URL”(可能没有),这意味着它sed必须看到与您预期不同的东西。通过使用 转义$,可以看到您的意图\sed

请注意,我最初/在替换操作中用作分隔符;但是,正如DarkDust正确指出的那样,由于 URL 中有斜杠,因此这行不通。我的正常后备字符是%- 如现在所示 - 但它可能出现在某些 URL 中并且可能不合适。如果我需要担心这一点,我可能会使用控制字符,例如 control-A - 或者我会使用 Perl,它可以播放而不会感到困惑。

您还可以将三个单独的-e表达式组合成一个,用分号代替它们。但是,我更喜欢将三个操作明确分开。

于 2010-09-14T19:13:06.483 回答
2

您可以通过如下修改主脚本来采取稍微不同的方法:-

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

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

于 2010-09-14T19:14:18.323 回答
1

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

我建议你这样做:

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

也就是说,第一个$需要被转义,因为你确实想要它。然后,/我不建议您使用|(pipe) 作为分隔符,因为它没有在您的字符串中使用。最后,用于"确保内容被 shell 解释为字符串。

然后,您可以将所有内容通过管道传输到不需要任何临时文件:

sed "s|\$URL|${emsurl}|g" | sed "s|\$USER|${emsuser}|g" | sed "s|\$PASSWRD|${emspasswd}|g"
于 2010-09-14T19:16:34.573 回答
0

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

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

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

于 2015-01-13T16:54:42.643 回答