0

ユーザーが選択した場合に特定のプログラムにstartupflagsを挿入できるサブプログラム/プロセスを一覧表示する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

変数を展開するには、シェルに二重引用符が必要です。

$ 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

echo $PATH印刷とは何ですか?PATHは通常、コロンで区切られたディレクトリのリストであることをご存知ですか?これは本当にあなたが望むものですか?それは、例えばに拡大するでしょう

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

これは間違いなくあなたが期待するものではありません。変数名が衝突している可能性があり、。以外の名前を使用する必要がありますPATH

于 2012-12-04T13:00:43.643 に答える
0

$PGMPATHにはスラッシュがあると思います。それらはsed構文に干渉します。

|のような他の文字を使用できます または、通常の代わりに区切り文字として%/
例:試してみてください:

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

または、ここのsedマニュアル\%regexp%に記載されている構文を使用することもできます。(私はそれを自分で使用したことはありませんが..)

別の代替オプションは、sedの別の行を使用して、$PGMPATH内のすべてのスラッシュをエスケープすることです。しかし、それはもっと難しいでしょう。

また、sudo_Oで示されているように、一重引用符で引用すると変数が展開されないため、一重引用符を二重引用符に変更しました。

于 2012-12-04T13:21:27.117 に答える