我正在尝试在脚本中的特定行之前插入变量。这是我正在使用的代码:
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
也许还可以考虑使用多个表达式使其成为单行命令,其中每个表达式实际上都是一行。
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
由于您在双引号下进行操作,因此需要将反斜杠的数量加倍:
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 代码中植入 shell 变量时必须小心。它们必须先绝育,然后再使用。例如,如果您的 shell 变量中有一个斜杠“/”怎么办?