スクリプトの特定の行の前に変数を挿入しようとしています。これは私が使用するコードです:
var1=$(echo "database1=")
var2=$(echo "database2=")
var3=$(echo "database3=")
sed -i "/#variables/i \
$var1\
$var2\
$var3" /data1/create_database
create_database
上記のコマンドを実行した後、次のように表示したいと思います。
database1=
database2=
database3=
#variables
しかし、私は次のような結果を得ます。
database1= database2= database3=
#variables
いくつかの方法を試しましたが、役に立たなかった。どうすればいいですか?
答え1
変数を設定するためにコマンド置換は必要ありません。
var1="database1="
var2="database2="
var3="database3="
改行を追加するには一重引用符が必要だと思いますが、変数を二重引用符として引用すると不正に見えます。変数にスペース文字が含まれている場合は、二重引用符が必要です。
sed -i '/#variables/i\
'"$var1"'\
'"$var2"'\
'"$var3" /data1/create_database
GNU sedを使用すると、改行文字を簡単に追加できます。
sed -i "/#variables/i$var1\n$var2\n$var3" /data1/create_database
答え2
エスケープシーケンス(\n
)を使用して改行を挿入できます。気づく
sed -i "/#variables/i \
$var1\n$var2\n$var3" /data1/create_database
等しい
sed -i "/#variables/i $var1\n$var2\n$var3" /data1/create_database
したがって、二重バックスラッシュが必要です。
sed -i "/#variables/i\\
$var1\n$var2\n$var3" /data1/create_database
各式が実際に1行の1行コマンドになるように複数の式を使用することも検討してください。
sed -i -e '/#variables/i\' -e "$var1\n$var2\n$var3" /data1/create_database
最後に、変数をエスケープする必要があるかもしれません。
var1=$(echo "database1=" | sed 's/[]\/$*.^&[]/\\&/g')
var2=$(echo "database2=" | sed 's/[]\/$*.^&[]/\\&/g')
var3=$(echo "database3=" | sed 's/[]\/$*.^&[]/\\&/g')
sed -i -e '/#variables/i\' -e "$var1\n$var2\n$var3" /data1/create_database
答え3
二重引用符内で作業するので、バックスラッシュの数を2倍にする必要があります。
sed -i "/#variables/i \\
$var1\\
$var2\\
$var3" /data1/create_database
それを壊すバックスラッシュを数えるよりも良いことがある場合は、sed
詳細を処理することができますが、そうするとコードコストが発生します。
sed -i "/#variables/{H;s/.*//;x;}
s/\\n/$var1&$var2&$var3&/
" /data1/create_database
または改行への言及がない場合:
sed -i "/#variables/{
h
s/.*/$var1/p
s/.*/$var2/p
s/.*/$var3/p
g
}" /data1/create_database
もちろん、sedコードにシェル変数を挿入するときは注意が必要です。使用する前に中性化手術をする必要があります。たとえば、シェル変数にスラッシュ「/」があるとどうなりますか?