无法通过变量在sed中定义行号

Unable to define line number in sed by variable

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

对于第二节,我得到以下输出: sed:-e 表达式 #1,字符 3:未知命令: ' sed: -e expression #1, char 3: unknown command: '

对于第三节,我得到以下输出: ./test.sh: 第 22 行:在寻找匹配的“”时出现意外的 EOF ./test.sh:第 24 行:语法错误:文件意外结束

编辑,将 sed 命令重写为 sed -i "${ary[$key]}" 会生成以下错误输出:sed: -e expression #1, char 3: unknown command: `

我认为你把问题复杂化了。您的脚本可以简化为:

sed 's/\(max_allowed_packet\).*/ = 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

我选择遍历数组的 values,而不是键,以便稍微简化事情。当使用 -i 选项时,指定一个备份文件总是一个好主意,就像我所做的那样。