You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sed处理grub配置时范围删除命令取消首行注释后失效问题

异常原因

你脚本首行末尾闭合大括号后的多余分号,导致GNU sed将后续所有命令都识别为/menuentry/{ ... }块内的命令,仅当行匹配menuentry时才会执行后续的替换、范围删除逻辑。而submenu开头的行不匹配menuentry规则,范围删除命令完全不会被触发,所以出现失效问题。
POSIX标准的sed语法不支持闭合大括号后直接跟分号作为命令分隔符,即便GNU sed做了扩展兼容,这种写法也很容易出现解析异常。

修复方案

把首行闭合大括号后的分号移到大括号内部,或者直接删除该分号即可。修改后的完整sed脚本如下:

$ cat ./grub2clean.why-0.sed
/menuentry/{ s/^/\n/; s/--\(class\|id\) .*$/\{/; }

/Ubuntu/s/Ubuntu/UUUU/;
/^submenu /,/^}/d;
/UUUU/s/UUUU/!Ubuntu/;

修改后重新执行sed -f ./grub2clean.why-0.sed grub.test.cfg即可得到预期结果。

额外优化建议

如果担心嵌套大括号导致范围匹配不准确,可以把范围删除规则修改为适配嵌套层级的写法,当前测试文件中submenu内部的}都带有缩进,原规则/^submenu /,/^}/d可以正常工作。

内容的提问来源于stack exchange,提问作者xpt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:24:03