0

我有一个 bash 脚本,其中列出了子程序/进程,如果用户选择,可以将启动标志插入特定程序。我想匹配以下格式的字符串,并且根据用户选择的 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 就不会替换。我已经尝试了很多,但我无法让它工作。

建议?

4

3 回答 3

1

您需要双引号为 shell 扩展变量:

$ 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
于 2012-12-04T13:10:38.490 回答
0

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

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

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

或者,您可以使用此处 sed 手册\%regexp%中给出的语法。(虽然我自己没有使用过它..)

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

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

于 2012-12-04T13:21:27.117 回答
0

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

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

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

于 2012-12-04T13:00:43.643 回答