Bash 无法在sed by变量中定义行号

Bash 无法在sed by变量中定义行号,bash,sed,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 # s

我试图使用数组来定义要使用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表达式#1,字符3:未知命令:
"

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


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

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

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
选项时,像我所做的那样指定一个备份文件总是一个好主意。

欢迎使用堆栈溢出!这个问题的格式很好,但我认为如果您实际添加了修正(以问号结尾的一句话)。我已经用建议变更的不同迭代及其输出更新了帖子。我感谢您的帮助,但我得到的错误与困扰我的错误相同。我的答案中有一个拼写错误(额外的双引号)。它现在能用了吗?@DavidB。我编辑了我的答案,展示了一种更简单的方法来做你想做的事。请看我在顶部添加的部分。太棒了!胜利的单线解决方案!