使用'$'替换的BASH / SED不起作用

时间:2012-12-04 12:57:46

标签: bash sed

我有一个bash脚本,列出了用户可以选择的子程序/进程,将startupflags插入到特定程序中。我希望匹配以下格式的字符串,具体取决于用户选择的pgm,我想用{PGMPATH} / pgm的新标志插入/替换字符串。现有程序根据以下内容列在启动文件中:

start -existingFlag ${PGMPATH}/pgm
start -existingFlag -anotherExistingFlag ${PGMPATH}/anotherPgm
start -existingFlag -anotherFlag ${PGMPATH}/yetAnotherPgm otherStuff

但是首先我尝试匹配硬编码字符串(将来朝向启动文件中的行):

start -existingFlag ${PGMPATH}\/pgm*

并将其替换为如下所示的新行:

*start -existingFlag -newFlag ${PGMPATH}\/pgm*

来自剧本:

existingString="start -existingFlag ${PGMPATH}\/pgm"
newString="start -existingFlag -newFlag ${PGMPATH}\/pgm"
sed 's/$replaceString/$newString/g' $STARTUPCONFFILE

只要字符串中没有'$'(恰好在{PGMPATH}之前),这就可以了(字符串被替换)但是只要在$ {PGMPATH} SED中添加'$'就不会更换。我已经尝试了很多,但我无法让它工作。

建议?

3 个答案:

答案 0 :(得分:1)

您需要使用双引号来扩展变量:

$ set newString=1                                                         
$ set replaceString=one

# using single quotes: no expansion -> no replacement!              
$ echo one | sed 's/$replaceString/$newString/g'
one

# using double quotes: expansion -> replacement!
$ echo one | sed "s/$replaceString/$newString/g"
1

答案 1 :(得分:0)

echo $PATH打印什么?您是否知道PATH通常是以冒号分隔的目录列表?这真的是你想要的吗?它会扩展到,例如

start -existingFlag /usr/bin:/bin:/usr/local/bin/pgm

这肯定不是你所期望的。也许您有一个变量名称冲突,并且应该使用除PATH之外的其他名称。

答案 2 :(得分:0)

我想,$ PGMPATH会有斜线。它们会干扰sed语法。

您可以使用其他字符,例如|或%作为分隔符,而不是通常的/ 例如尝试:

sed "s|$replaceString|$newString|g"

或者,您可以使用sed manual here中给出的\%regexp%语法。 (我自己也没有用过它。)

另一个替代选项是使用另一行sed来转义$ PGMPATH中的所有斜杠;但那会更难。

另外,正如sudo_O所指出的,我已将单引号更改为双引号,因为当引用单引号时,变量不会扩展。