我有一个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中添加'$'就不会更换。我已经尝试了很多,但我无法让它工作。
建议?
答案 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所指出的,我已将单引号更改为双引号,因为当引用单引号时,变量不会扩展。