【问题标题】:Alternative way of sed range substitution in busybox sed or awkbusybox sed 或 awk 中 sed 范围替换的替代方法
【发布时间】:2021-12-07 14:02:32
【问题描述】:

鉴于以下(部分)olsrd.conf 文件,我想在busybox 中使用sed 或awk(尽可能)设置单个设置。

LoadPlugin "olsrd_httpinfo.so.0.1" {
  # defaults to 1978
  #PlParam "Port"   "8080"
  # if you dont set these, the default is to listen only on the loopback device
  #PlParam "Host"   "80.23.53.22"
  #PlParam "Net"    "10.0.0.0 255.0.0.0"
  #PlParam "Net"     "0.0.0.0 0.0.0.0"
  #PlParam "Host"   "127.0.0.1"
}

LoadPlugin "olsrd_txtinfo.so.1.1" {
  #PlParam "port"   "2006"
  #PlParam  "accept" "0.0.0.0"
}

LoadPlugin "olsrd_jsoninfo.so.1.1" {
  #PlParam "port"   "9090"
  #PlParam  "accept" "0.0.0.0"
}

使用 GNU sed 这在通常的 Linux 发行版中运行良好,示例如下:

MYPORT="1234"
sed -e "/^LoadPlugin.*olsrd_txtinfo.*/ , /}/ s/.*PlParam.*port.*$/PlParam \"port\" \"$MYPORT\"/I" olsrd.conf

但在busybox(v1.33.1)中,这会产生错误:sed: unsupported command ,

据我了解,busybox sed 不支持范围,因此出现此错误消息。

是否有替代方法可以使用busybox sed 或busybox awk 来实现?

【问题讨论】:

  • 尝试删除逗号周围的空格:...olsrd_.*/,/}/
  • 哦,太好了,成功了!谢谢!我从另一个问题中举了这个例子,并且 OP 添加了空格以提高可读性,我出于完全相同的原因将其留在那里......

标签: awk sed range substitution busybox


【解决方案1】:

除了删除, 运算符周围的空格(这是这里的罪魁祸首)之外,我建议对正则表达式进行更多调整:

  • 第一个匹配行检测模式末尾的.* 是多余的
  • -e 在这里是多余的
  • 替换命令中最后一个.* 之后的$ 是多余的(.* 已经匹配整行(实际上是字符串)
  • 如果您在 sed 命令周围使用单引号,您就不必担心以后如何转义双引号。只对变量部分加双引号,其余部分用单引号括起来
  • 此外,如果您使用#PlParam(使用^\([[:space:]]*\))捕获行上的初始空白,则可以保留缩进(在替换中使用\1 反向引用)。

所以,你可以使用

sed '/^LoadPlugin.*olsrd_txtinfo/,/}/ s/^\([[:space:]]*\).*PlParam.*port.*/\1PlParam "port" "'"$MYPORT"'"/I' olsrd.conf

请参阅online demo。

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 2010-10-27
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多