使用 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

也许还可以考虑使用多个表达式使其成为单行命令,其中每个表达式实际上都是一行。

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 变量中有一个斜杠“/”怎么办?

相关内容