2012-12-04 77 views
0

我有一个bash脚本,列出了如果用户选择将启动标志插入特定程序时可能会出现的子程序/进程。我想匹配以下格式的字符串,并根据用户选择的pgm我想插入/替换{PGMPATH}/pgm的新标志infront。

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

但先从我尽力配合朝着一个硬编码字符串(将来向在启动文件中的行):

start -existingFlag ${PGMPATH}\/pgm* 
现行方案是根据这样的事情在startupfile上市

,并用一个新行看起来像这样替换它:

*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就会工作(字符串被替换)不会取代。我已经尝试了很多,但是我无法完成它的工作。

对此提出建议?

回答

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

太好了,非常感谢。有效! – user1841901

0

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

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

这绝对不是您所期望的。也许你有一个变量名称冲突,应该使用另一个名称而不是PATH

+0

感谢您的评论。愚蠢的我。我试图简化一些事情,并且不考虑PATH环境变量,意外地选择了PATH的名称(不是真实的脚本)。我用另一个名字更新了 – user1841901

+0

啊,好的。那么你的问题是,在单引号中没有*参数替换*。 ''HOME''是'$ HOME',而''HOME''会扩展到'/ home/username'。 – Jens

0

我认为,会有在$ PGMPATH斜线。他们会干扰sed语法。

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

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

或者,你可以使用\%regexp%语法,在sed manual here给出。 (虽然我自己没有用过它..)

另一种替代选择是,使用另一行sed转义$ PGMPATH中的所有斜杠;但那会更困难。

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