sedを使用してスクリプトに複数行を挿入する

sedを使用してスクリプトに複数行を挿入する

スクリプトの特定の行の前に変数を挿入しようとしています。これは私が使用するコードです:

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コードにシェル変数を挿入するときは注意が必要です。使用する前に中性化手術をする必要があります。たとえば、シェル変数にスラッシュ「/」があるとどうなりますか?

関連情報