我尝试使用数组来定义要使用sed替换的行;我可以使用行号的变量删除行,但我不能使用该变量来定义要写入的行号。问题似乎存在于插入行中。如何将数组的值作为行号传递给sed?
#!/bin/bash
lineNum=$(sed -n '/max_allowed_packet/=' /etc/mysql/my.cnf)
IFS= #There's a space as the delimiter#
ary=($lineNum)
#for key in "${!ary[@]}";
# do
# sed -i '$ary[$key]'d /etc/mysql/my.cnf;
# #The folllowing line errors#
# sed -i "'$ary[$key]'imax_allowed_packet = 32M" /etc/mysql/my.cnf;
# #The above line errors#
#done
#for val in "${ary[@]}";
# do
# sed -i "${val}d" /etc/mysql/my.cnf;
# sed -i "${val}imax_allowed_packet = 32M" /etc/mysql/my.cnf;
# done
for val in "${ary[@]}";
do
sed -i "${val}s/.*/imax_allowed_packet = 32M" /etc/mysql/my.cnf";
done
对于脚本的第一节,我得到以下输出: 错误:sed:-e表达式#1,字符1:未知命令:`''
对于第二个Stanza,我得到以下输出:
sed:-e表达式#1,char 3:未知命令:
'
sed: -e expression #1, char 3: unknown command:
'
对于第三个Stanza,我得到以下输出: ./test.sh:第22行:在寻找匹配的'"'时出现意外的EOF ./test.sh:line 24:语法错误:意外的文件结尾
编辑,重写sed命令为sed -i "${ary[$key]}"
会生成以下错误输出:sed:-e expression#1,char 3:unknown命令:`
答案 0 :(得分:1)
我认为你的问题太复杂了。您的脚本可以简化为:
sed 's/\(max_allowed_packet\).*/\1 = 32M/' /etc/mysql.cnf
这会在max_allowed_packet
的每次出现时执行替换,将该行的其余部分设置为= 32M
。当您对结果感到满意时,添加-i
开关以覆盖文件。
Shell参数不会在单引号内展开,因此您需要使用双引号,例如sed -i "${ary[$key]}d"
。您可以使用set -x
查看此处发生的情况 - 此时,您将看到文字字符串$ary[$key]
,而不是数组值。
如果我理解你的意图(你想要替换整行),就不需要两次调用sed:
for val in "${ary[@]}"; do
sed -i.bak "${val}s/.*/imax_allowed_packet = 32M" /etc/mysql/my.cnf
done
我选择循环遍历数组的值,而不是键,以简化一些事情。使用-i
选项时,最好像我一样指定备份文件。