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。
鉴于以下(部分)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。