【问题标题】:Unable to define line number in sed by variable无法通过变量定义 sed 中的行号
【发布时间】:2015-03-31 15:29:27
【问题描述】:

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

【问题讨论】:

  • 欢迎来到 Stack Overflow!这个问题的格式很好,但我认为如果你真的添加一个问题(以问号结尾的句子)会更好。

标签: bash sed


【解决方案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 选项时,最好指定一个备份文件,就像我所做的那样。

【讨论】:

  • 我已经用提议的更改及其输出的不同迭代更新了帖子。感谢您的帮助,但我遇到了同样困扰我的错误。
  • 我的回答中有一个错字(额外的双引号)。现在可以用了吗?
  • @DavidB。我已经编辑了我的答案,以展示一种更简单的方式来做你想做的事。请查看我在顶部添加的部分。
  • 太棒了!胜利的单线解决方案!
猜你喜欢
  • 2021-11-27
  • 2017-01-24
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
相关资源
最近更新 更多