无法通过变量在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
选项时,指定一个备份文件总是一个好主意,就像我所做的那样。
我正在尝试使用数组来定义要使用 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
选项时,指定一个备份文件总是一个好主意,就像我所做的那样。