シェルスクリプト内の文字列を置き換えるために以下のコードを使用しています。
echo $LINE | sed -e 's/12345678/"$replace"/g'
しかし$replace
、その変数の値の代わりに置き換えられています。
誰かが何が悪かったのか教えてもらえますか?
回答:
を解釈$replace
する場合は、変数の置換を妨げるため、一重引用符を使用しないでください。
試してください:
echo $LINE | sed -e "s/12345678/\"${replace}\"/g"
。あなたがいる場合は、引用符を入れたいと想定していない引用符をしたい、使用:
echo $LINE | sed -e "s/12345678/${replace}/g"
筆記録:
pax> export replace=987654321
pax> echo X123456789X | sed "s/123456789/${replace}/"
X987654321X
pax> _
エスケープしないと混乱を招くため、(たとえば)${replace}
重要な文字が含まれていないことを確認してください。しかし、あなたが言うように、ある数値を別の数値に置き換えるのであれば、それは問題にはなりません。sed
/
set
も必要ありません(とにかくそれをどのように使用する予定でしたか?)。ただreplace=987654321
。
export
変数が子供用に設定されていることを確認するために使用しますが、あなたが言うように、それを簡単に回避することもできます。ただし、export
ここでの使用の有無は関係なく(スタイルの問題)、実際の回答(sed
コマンド内での変数の使用方法)には影響しません。
-i
オプションで動作していないようです。なぜでしょうか?またはそれを機能させる方法は?
$
または二重引用符で囲まれた文字列のシェルの置換メカニズムから保護するために、バックスラッシュでエスケープする必要があることも指摘します。`
sed
シェル(bash / ksh)を使用できます。
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
/bin/sh
多くの最近のLinuxにあるダッシュでも失敗します。
質問に固有ではありませんが、以前の回答から明確にするために同じ種類の機能を拡張する必要がある人のために:
# create some variables
str="someFileName.foo"
find=".foo"
replace=".bar"
# notice the the str isn't prefixed with $
# this is just how this feature works :/
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'
単一引用符は引き続き使用できますが、変数を適切な場所に展開する場合は、それらを「開く」必要があります。そうでない場合、文字列は「文字通り」に解釈されます(@paxdiabloが正しく述べられているように、彼の答えも正しいです)
$replace
引用符の外で使用すると、シェルが値に対して空白のトークン化とワイルドカード拡張を実行するという問題があります。これは単純な値で機能するように見えますが、重要な文字列で劇的に爆発する可能性があります。これを本番コードで使用しないでください。
二重引用符を使用することをお勧めします。単一のクプテスは、内部を変更できない場合や変数の置換を呼び出すことができない場合に使用したのと同じように非常に強力です。
二重引用符を使用してください。
echo $LINE | sed -e "s/12345678/$replace/g"