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

如何使用sed匹配模式时排除指定的多个配置节?

如何用sed精准保留指定配置节并移除后续内容

原始配置文件

; My Config
;

[CITY]
URL='my.city.com'
ID='1234'
PID='1'

[SITE]
URL='my.site.com'
ID='2345'
PID='2'

[UNIT]
URL='my.unit.com'
ID='3456'
PID='3'

[BOB]
URL='my.bob.com'
ID='123456'
PID='15'

. . .

需求与现有问题

需求:保留配置中**[CITY]、[SITE]、[UNIT]**三个固定配置节,移除这三个节之后的所有内容。

之前尝试过这条sed命令:

sed -e '/.*\[[^DUC].*\]/Q' test.conf

在示例配置里能得到预期结果:

; My Config
;

[CITY]
URL='my.city.com'
ID='1234'
PID='1'

[SITE]
URL='my.site.com'
ID='2345'
PID='2'

[UNIT]
URL='my.unit.com'
ID='3456'
PID='3'

但这条命令有明显缺陷:如果后续第一个配置节名称以C、S或U开头(比如[CAR]、[STORE]),就会失效——它只是排除了以非D、U、C开头的节,没法精准匹配指定的三个节名称。

用sed实现精准匹配的方案

完全可以用sed实现精准需求,不需要更换工具,提供两种可行思路:

方案一:匹配到非指定配置节时退出

sed -e '/^\[[^]]*\]$/{/^\[CITY\]$/b;/^\[SITE\]$/b;/^\[UNIT\]$/b;Q}' test.conf

逻辑说明:

  • /^\[[^]]*\]$/:精准匹配所有配置节的行(格式为[XXX])
  • /^\[CITY\]$/b;/^\[SITE\]$/b;/^\[UNIT\]$/b:如果是指定的三个节,直接跳过后续逻辑,继续处理下一行
  • Q:如果匹配到的是其他配置节,立即退出sed,后续内容不再输出

方案二:匹配到第三个指定节后终止(适用于节顺序固定的场景)

如果配置中三个节的顺序固定为CITY→SITE→UNIT,可以用更简洁的命令:

sed -e '/^\[UNIT\]$/{:a;n;/^\[[^]]*\]$/Q;ba}' test.conf

逻辑说明:

  • /^\[UNIT\]$/:匹配到[UNIT]节的行
  • :a;n:定义循环标签a,读取下一行
  • /^\[[^]]*\]$/Q:如果读到新的配置节行,直接退出;否则回到标签a继续读取下一行

补充说明

  • 如果三个配置节的顺序不固定,方案一更稳妥;
  • 如果顺序固定,方案二执行效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:55:35