次のコードを使用して、シェルスクリプト内の文字列を置き換えています。
echo $LINE | sed -e 's/12345678/"$replace"/g'
しかし、その変数の値の代わりに$replace
に置き換えられています。
誰が何が間違っていたのか教えてもらえますか?
$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
にとって重要な文字(たとえば/
など)を持たないように注意してください。しかし、あなたが言うように、ある番号を別の番号に置き換える場合、それは問題ではないはずです。
シェル(bash/ksh)を使用できます。
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
質問に固有ではありませんが、以前の回答からわかりやすくするために同じ種類の機能を必要とする人のために:
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
単一引用符は非常に強力です。中に入ると、離れるまで変数置換を呼び出すためにできることは何もありません。代わりに二重引用符を使用します。
echo $LINE | sed -e "s/12345678/$replace/g"
echo $LINE | sed -e 's/12345678/'$replace'/g'
引き続き一重引用符を使用できますが、変数を適切な場所で展開したい場合は「開く」必要があります。それ以外の場合、文字列は「リテラル」に取得されます(@paxdiabloが正しく述べているように、彼の答えも正しいです)
グレースフルソリューション が見つかりました。
echo ${LINE//12345678/$replace}
シェルに変数を展開させるには、次のような二重引用符を使用する必要があります
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
代わりにこれを使用してください
echo $LINE | sed -e 's/12345678/$replace/g'
これは単に引用符を削除するだけでうまくいきます