busybox sed 或 awk 中 sed 范围替换的替代方法

Alternative way of sed range substitution in busybox sed or awk

鉴于以下(部分)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 来实现?

除了删除作为此处罪魁祸首的 , 运算符周围的空格外,我建议对正则表达式进行更多调整:

  • 第一个匹配行检测模式末尾的.*是多余的
  • 这里的-e是多余的
  • $ 在替换命令中的最后一个 .* 之后是多余的(.* 已经匹配整行(实际上是字符串)
  • 如果你在sed命令两边使用单引号,你以后就不用担心如何转义双引号了。只把可变部分用双引号引起来,其余用单引号引起来
  • 此外,如果您捕获带有 #PlParam 的行的初始空白(使用 ^\([[:space:]]*\)),您可以保留缩进(在替换中使用 </code> 反向引用)。</li> </ul> <p>所以,您可以使用</p> <pre><code>sed '/^LoadPlugin.*olsrd_txtinfo/,/}/ s/^\([[:space:]]*\).*PlParam.*port.*/PlParam "port" "'"$MYPORT"'"/I' olsrd.conf

    参见online demo