web-dev-qa-db-ja.com

変数を使用してシェルスクリプトの文字列を置き換える

次のコードを使用して、シェルスクリプト内の文字列を置き換えています。

echo $LINE | sed -e 's/12345678/"$replace"/g'

しかし、その変数の値の代わりに$replaceに置き換えられています。

誰が何が間違っていたのか教えてもらえますか?

72
Vijay

$replaceを解釈する場合は、単一引用符を使用しないでください。変数の置換が妨げられるためです。

試してください:

echo $LINE | sed -e "s/12345678/\"${replace}\"/g"

引用符を入れたいと仮定します。do n't引用符が必要な場合は、以下を使用します。

echo $LINE | sed -e "s/12345678/${replace}/g"

転写:

pax> export replace=987654321
pax> echo X123456789X | sed "s/123456789/${replace}/"
X987654321X
pax> _

${replace}sedにとって重要な文字(たとえば/など)を持たないように注意してください。しかし、あなたが言うように、ある番号を別の番号に置き換える場合、それは問題ではないはずです。

113
paxdiablo

シェル(bash/ksh)を使用できます。

$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
62
ghostdog74

質問に固有ではありませんが、以前の回答からわかりやすくするために同じ種類の機能を必要とする人のために:

str="someFileName.foo"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result    
# result is: someFileName.bar

str="someFileName.sally"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result    
# result is: someFileName.sally because ".foo" was not found
12
bob

単一引用符は非常に強力です。中に入ると、離れるまで変数置換を呼び出すためにできることは何もありません。代わりに二重引用符を使用します。

echo $LINE | sed -e "s/12345678/$replace/g"
6
Dave
echo $LINE | sed -e 's/12345678/'$replace'/g'

引き続き一重引用符を使用できますが、変数を適切な場所で展開したい場合は「開く」必要があります。それ以外の場合、文字列は「リテラル」に取得されます(@paxdiabloが正しく述べているように、彼の答えも正しいです)

3
akira

グレースフルソリューション が見つかりました。

echo ${LINE//12345678/$replace}
2
Nicolae Iotu

シェルに変数を展開させるには、次のような二重引用符を使用する必要があります

sed -i "s#12345678#$replace#g" file.txt

$replaceに特殊なsed文字(#\)が含まれている場合、これは壊れます。ただし、$replaceを前処理して引用することができます。

replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g')
sed -i "s#12345678#$replace_quoted#g" file.txt
1
Matthieu Moy

代わりにこれを使用してください

echo $LINE | sed -e 's/12345678/$replace/g'

これは単に引用符を削除するだけでうまくいきます

0
Tunde Pizzle