无法在变量中定义sed中的行号

时间:2015-03-31 15:29:27

标签: bash sed

我尝试使用数组来定义要使用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命令:`

1 个答案:

答案 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选项时,最好像我一样指定备份文件。